一些网站是这样说的:
@property (nonatomic, strong) MyObject *foo;
self.foo = [[MyObject alloc] init];
将保留计数增加到 2
但是自从最新的 xcode 版本或 ARC 以来,这应该不是问题,对吧?
根据视频我们可以取出所有autorelease
因此:
@property (nonatomic, strong) MyObject *foo;
self.foo = [[[MyObject alloc] init] autorelease];
变成这样
@property (nonatomic, strong) MyObject *foo;
self.foo = [[MyObject alloc] init];
那么我应该忽略那个网站,上面写着 self.foo = [[MyObject alloc] init];
将保留计数增加到 2?
最佳答案
如果没有 ARC,您可能应该使用 retain
(以及相应的 assign
)而不是 strong
(和 weak
>)。在第一个示例中,没有 ARC,- init
方法返回一个保留计数为 1 的对象,并且 foo
属性的 setter 将保留计数增加到 2。
在第二个示例中(必须没有 ARC,因为 autorelease
不适用于 ARC),- autorelease
调用将对象添加到自动释放池中,并且将其保留计数减少 1,因此该对象最终的保留计数为 1(对于该属性)。
使用 ARC,如第三个示例所示,您根本不需要担心保留计数 - 这就是 ARC 的要点。在幕后,- init
仍应返回一个保留计数为 1 的对象,并且 foo
的 setter 仍应增加保留计数,但编译器应插入一个-release
在 setter 被调用之后的某个地方。基本上,使用 ARC,因为该属性是strong
,一旦将其分配给该属性,您就可以依赖该对象继续存在,并且不必考虑retain
/发布
/自动释放
。
关于ios - 保留分配和初始化计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581598/