有些网站说这个:
@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的网站吗?
答案 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使该陈述不真实。自动释放没有消失,它现在只是由编译器插入而你却看不到它。