保留count和init的计数

时间:2013-03-22 23:46:44

标签: ios objective-c cocoa-touch automatic-ref-counting

有些网站说这个:

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

ARC使该陈述不真实。自动释放没有消失,它现在只是由编译器插入而你却看不到它。