1

ARC ライブラリを使用している非 ARC プロジェクトがあります。ライブラリ メソッドから返されたオブジェクトを解放する必要があるかどうか、私は混乱しています。次に例を示します。

- (void)test{
    LibObject* obj1 = [[LibObject alloc] init];
    LibObject* obj2 = [obj1 otherObj];

    [obj1 release]; //should I release it?
    [obj2 release]; //should I release it?
}

私の知る限り、オブジェクトが自動解放プールにある場合は、そのままにしておく必要があります。そうでなければ、私はそれをリリースする必要があります。

ただし、ARC文書には次のように記載されています

そのような関数またはメソッドから戻るとき、ARC は return ステートメントの評価の時点で値を保持し、次にすべてのローカル スコープを離れて、値が呼び出しの境界を越えて存在することを保証しながら、保持のバランスを取ります。最悪の場合、これには自動解放が含まれる可能性がありますが、呼び出し元は値が実際に自動解放プールにあると想定してはなりません。

このドキュメントは、オブジェクトが自動解放されているとは想定できないため、常にオブジェクトを解放する必要があることを暗示していますか?

4

4 に答える 4

4

「高度なメモリ管理プログラミングガイド」のメモリ管理ポリシーを参照してください。

作成するオブジェクトを所有
する名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッド(alloc、newObject、mutableCopyなど)を使用してオブジェクトを作成します。

所有していないオブジェクトの所有権を放棄してはなりません

これらのルールは、ARCでコンパイルされたメソッドと一致しています。ARCのドキュメントでは、最初のカテゴリのメソッドの動作は「3.2.2。保持される戻り値」で説明されています。

このような関数またはメソッドから戻る場合、ARCはreturnステートメントの評価時点で値を保持します...

これは、呼び出し元がオブジェクトを解放する必要があることを意味します。

2番目のカテゴリのメソッドは、「3.2.3。保持されない戻り値」で説明されています。

このような関数またはメソッドから戻る場合、ARCはreturnステートメントの評価時点で値を保持し、次にすべてのローカルスコープを残して、保持のバランスを取ります...

つまり、呼び出し元はオブジェクトを解放してはなりません。

したがって、あなたの例では:

LibObject* obj1 = [[LibObject alloc] init];
LibObject* obj2 = [obj1 otherObj];
[obj1 release]; //should I release it? --> YES
[obj2 release]; //should I release it? --> NO

obj1を使用して作成されたため、を所有allocしているため、をリリースする必要がありますobj1

あなたは所有していないobj2ので、それを解放してはなりません。

注:コードでXcode静的アナライザーを実行すると、これらのルールに違反している場所が正確に表示されます。

于 2012-12-13T12:30:10.403 に答える
2

ARC が有効なクラスから非 ARC が有効なクラスにオブジェクトを取得する場合、メモリを管理する責任があります。

ARC は、コンパイル時に ARC 対応コードに保持、解放を入れるだけです。非 ARC モードの他のクラスまたはオブジェクトのメモリは管理されません。

必要に応じて、そのようなオブジェクトを解放する必要があります。

于 2012-12-13T11:49:18.050 に答える
0

私の理解では、-fno-objc-arcこのファイルにコンパイラ フラグを使用する場合は、保持/解放を自分で処理する必要があります。だからあなたは電話するべき[obj1 release]です。自分で呼び出すことになっていない場合、コンパイラはそれに応じて警告します。

于 2012-12-13T11:47:20.277 に答える