1

私はARCを使用していますが、Objective-CのMRR部分を読んでおり、のプロパティViewControllerが(非ARCの場合)である場合のようです。

@property (retain, nonatomic) Foo *foo;

次に、viewDidLoadの直後ViewControllerに実行する必要があります:releaseallocinit

- (void)viewDidLoad
{
    [super viewDidLoad];

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

}

それ以外の場合、は(インスタンス変数)にretain割り当てられたときにFooオブジェクトの参照カウントを1回インクリメントし、参照カウントも1回インクリメントするため、所有権を2回要求するため、直後に存在する必要があります。および?_fooallocreleaseallocinit

の直後にこの方法allocが続くので、少し奇妙に見えると思います。release

(もしそうならself.foo = [Foo fooByString: @"hello"]、1つの所有権は自動解放プールによって主張され、もう1つはViewControllerによって主張され、イベントループの終わりに、自動解放プールは排出され、1つの所有権を主張しないため、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の非自動リリースインスタンスを作成するため、不要なリリース呼び出しを回避します。また、初期化を完全に制御できるオブジェクトを処理するために自動解放プールを用意する必要がなくなります。あなたはあなたがあなたのviewControllerによってfooを所有者にしたいことを知っています。実行ループの戻り時に保持カウントを減らすためだけに、所有権を2回主張する必要はありません。

于 2012-09-10T14:59:41.153 に答える