0
    SomeClass *obj = [SomeClass alloc];
    NSLog(@"%@", obj);
    obj = [obj initWithNSNumber:[NSNumber numberWithInt:1]];
    NSLog(@"%@", obj);

两个日志语句始终显示相同的地址。这实际上是我所期望的,但这是标准的 Objective-C 行为吗?我的意思是我可以指望这在不同的编译器/语言版本中是相同的吗?

我真正想要的是一个很好的教程,对象初始化和相关过程如何在 Objective-C 中真正工作。

编辑:在 Wain 回答问题后添加信息:如果初始化程序是这样实现的,我能否指望这在不同的编译器/语言版本中是相同的:

self = [super init];
if (self) {
//..
}
return self
4

1 回答 1

2

你真的不能保证在任何时候。任何init方法实现都有权丢弃您分配的内存并将其替换为更合适的其他内容(基于传递给它的参数)。如果您尝试使用,NSArray您很可能会得到不同的地址(任何作为类集群实现的都是完美的候选者)。


从您的编辑中,super可以做完全相同的事情。这就是你写的原因:

self = [super init];

因此,如果super确实更改了分配的内存,那么self引用将被更新以指向新的分配。

不,您不能保证它在不同版本的 SDK 中是相同的。

于 2013-08-23T10:06:38.947 回答