init总是应该使用相同的内存块吗?

时间:2013-08-23 10:04:19

标签: objective-c memory-management

    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

1 个答案:

答案 0 :(得分:2)

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


通过编辑,super可以做同样的事情。这就是你写的原因:

self = [super init];

因此,如果super确实更改了已分配的内存,则self引用将更新为指向新分配。

不,您无法保证在不同版本的SDK中它会相同。