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
答案 0 :(得分:2)
你无法在任何时候保证它。任何init
方法实现都在其权利范围内,可以丢弃已分配的内存,并将其替换为更合适的其他内容(基于传递给它的参数)。如果您尝试使用NSArray
,您可能会得到不同的地址(任何实现为类集群的东西都是完美的候选者)。
通过编辑,super
可以做同样的事情。这就是你写的原因:
self = [super init];
因此,如果super
确实更改了已分配的内存,则self
引用将更新为指向新分配。
不,您无法保证在不同版本的SDK中它会相同。