0

在 Effective Objective-C 2.0 中有以下代码片段:

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

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

然后作者说:

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

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

作者上面那句话是什么意思?

4

2 回答 2

5

他的意思是:

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

就那么简单。如果这在 MRC 下有效,那么它之所以有效,原因有一个:

[SomeClass new]

相当于

[[SomeClass alloc] init]

所以_object无论如何都会有一个参考计数。

于 2013-07-27T19:40:45.540 回答
3

本书作者混淆了两种不同的东西。一、表达式:

[EOCOtherClass new]

返回对调用者拥有所有权的对象的引用(作为可能的许多所有者之一)。在 MRC 下,调用者在某些时候必须安排放弃该所有权(releaseautorelease)。调用者可以通过传递所有权直接或间接地做到这一点。在 ARC 下,所有权是自动管理的。

其次,声明:

id _object;

声明一个持有类型引用的变量id在 MRC 下,这就是它所做的一切,不拥有任何包含引用引用的变量- 它们只是存储引用的地方,所有权管理是分开的。

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

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

于 2013-07-27T20:04:40.457 回答