不保留实例变量

时间:2013-07-27 19:37:41

标签: objective-c

在Effective Objective-C 2.0中,有以下代码剪辑:

@interface EOCClass : NSObject {
    id _object;
}
@end

@implementation EOCClass
- (void)setup{
    _object = [EOCOtherClass new];
}
@end

然后,作者说:

  

“_object实例变量不会在手动引用计数下自动保留其值,但在ARC下会保留。”

我在XCode中测试了上面的片段,实例变量确实保留了值(即一切似乎都正常)。

作者对上述句子的意思是什么?

2 个答案:

答案 0 :(得分:5)

他的意思是:

  

_object实例变量不会在手动引用计数下自动保留其值,但在ARC下。

这很简单。如果这在MRC下工作,它的作用有一个原因:

[SomeClass new]

相当于

[[SomeClass alloc] init]

所以_object无论如何都会有一个引用计数。

答案 1 :(得分:3)

书籍作者混淆了两件不同的事情。首先,表达式:

[EOCOtherClass new]

返回对调用者拥有所有权的对象的引用(可能是许多所有者之一)。在MRC下,调用者必须安排放弃该所有权(releaseautorelease)。调用者可以通过传递所有权直接或间接地执行此操作。在ARC下,所有权自动管理。

其次,声明:

id _object;

声明一个包含id类型引用的变量。在MRC下就是这样,的变量不拥有包含引用引用的任何内容 - 它们只是存储引用的位置,所有权管理是独立的。

然而,在ARC变量下,可以拥有它们引用的内容,而实例变量的默认所有权模式是strong - 这意味着该变量保持其引用内容的所有权。当新引用存储到变量中时,所有权将放弃先前引用的对象和所有权在新引用的对象上声明。所有这些都是自动的,由ARC处理。

在MRC和ARC下,显示的代码片段分配并拥有EOCOtherClass的实例。在MRC下,必须在某些时候手动放弃所有权。在ARC下,所有权将在适当的时候自动放弃。