在Effective Objective-C 2.0中,有以下代码剪辑:
@interface EOCClass : NSObject {
id _object;
}
@end
@implementation EOCClass
- (void)setup{
_object = [EOCOtherClass new];
}
@end
然后,作者说:
“_object实例变量不会在手动引用计数下自动保留其值,但在ARC下会保留。”
我在XCode中测试了上面的片段,实例变量确实保留了值(即一切似乎都正常)。
作者对上述句子的意思是什么?
答案 0 :(得分:5)
他的意思是:
_object实例变量不会在手动引用计数下自动保留其值,但在ARC下。
这很简单。如果这在MRC下工作,它的作用有一个原因:
[SomeClass new]
相当于
[[SomeClass alloc] init]
所以_object
无论如何都会有一个引用计数。
答案 1 :(得分:3)
书籍作者混淆了两件不同的事情。首先,表达式:
[EOCOtherClass new]
返回对调用者拥有所有权的对象的引用(可能是许多所有者之一)。在MRC下,调用者必须安排放弃该所有权(release
或autorelease
)。调用者可以通过传递所有权直接或间接地执行此操作。在ARC下,所有权自动管理。
其次,声明:
id _object;
声明一个包含id
类型引用的变量。在MRC下就是这样,的变量不拥有包含引用引用的任何内容 - 它们只是存储引用的位置,所有权管理是独立的。
然而,在ARC变量下,可以拥有它们引用的内容,而实例变量的默认所有权模式是strong
- 这意味着该变量保持其引用内容的所有权。当新引用存储到变量中时,所有权将放弃先前引用的对象和所有权在新引用的对象上声明。所有这些都是自动的,由ARC处理。
在MRC和ARC下,显示的代码片段分配并拥有EOCOtherClass
的实例。在MRC下,必须在某些时候手动放弃所有权。在ARC下,所有权将在适当的时候自动放弃。