2

一些网站是这样说的:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

将保留计数增加到 2

但是自从最新的 xcode 版本或 ARC 以来,这应该不是问题吧?

根据视频我们可以取出所有自动释放

所以从这里:

@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 的网站吗?

4

2 回答 2

3

如果没有 ARC,您可能应该使用retain(和相应地assign)而不是strong(和weak)。在您的第一个示例中,没有 ARC,该- init方法返回一个保留计数为 1 的对象,并且该foo属性的设置器将保留计数增加到 2。

在您的第二个示例中(必须没有 ARC,因为 ARCautorelease不可用),- autorelease调用将对象添加到自动释放池并将其保留计数减少 1,因此对象最终保留计数为 1(对于财产)。

使用 ARC,就像在您的第三个示例中一样,您根本不需要担心保留计数——这就是 ARC 的重点。在幕后,- init应该仍然返回一个保留计数为 1 的对象,并且 setterfoo应该仍然增加保留计数,但是编译器应该在- release调用 setter 之后的某处插入。基本上,使用 ARC,因为属性是strong,一旦将对象分配给属性,您就可以依赖该对象继续存在,而不必考虑retain// releaseautorelease

于 2013-03-22T23:55:26.203 回答
1

ARC 使这种说法不真实。自动释放并没有消失,它只是现在由编译器插入,你看不到它。

于 2013-03-22T23:50:42.097 回答