1

我正在使用 ARC,但正在阅读 Objective-C 的 MRR 部分,并且似乎ViewController是(对于非 ARC)的属性:

@property (retain, nonatomic) Foo *foo;

那么viewDidLoadofViewController将需要在andrelease之后做一个:allocinit

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.foo = [[Foo alloc] init];
    [self.foo release];

}

否则,retainFoo 对象在分配给_foo(实例变量)时会增加一次引用计数,并且alloc还会增加一次引用计数,因此它声称拥有两次所有权,因此,releaseallocinit

我只是觉得它看起来有点奇怪,因为 analloc后面紧跟着 arelease这种方式。

(如果我们这样做是 a self.foo = [Foo fooByString: @"hello"],那么自动释放池声明了一个所有权,ViewController 声明了一个所有权,并且在事件循环结束时,自动释放池耗尽,并取消声明一个所有权,因此 Foo 对象被正确拥有仅一次。(但如果 Foo 没有这样的方法并且只有allocand init,那么就release需要立即数。))

4

2 回答 2

4

您基本上是正确的,尽管通常有几种方法可以使它看起来不那么尴尬:

Foo* someFoo = [[Foo alloc] init];
self.foo = someFoo;
[someFoo release];

或者更简洁地说:

self.foo = [[[Foo alloc] init] autorelease];
于 2012-09-10T14:58:49.753 回答
0

如果您在 viewController 的构造函数/init 上,您需要做的是:

_foo=[[Foo alloc] init];

为了避免不必要的释放调用,因为 alloc/init 创建了一个非自动释放的 foo 实例。此外,它将不再需要自动释放池来处理我们可以完全控制其初始化的对象。您知道您希望 foo 成为您的 viewController 的所有者。不必为了在运行循环返回时减少保留计数而两次声明所有权。

于 2012-09-10T14:59:41.153 回答