2

Objective-c でのメモリ管理とメソッド呼び出しについて、非常に簡単な質問があります。

私が持っていると想像してください:

- (void)someFunction
{
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Value 1", nil];
    [self someOtherFunction:array];
}

- (void)someOtherFunction:(NSMutableArray *)array
{
    // Should I retain array here?
    [array addObject:@"Value 2"];
    // And then release ?
}

これは単純な例ですが、同じオブジェクト パラメータを持つメソッド呼び出しが 10 回ほどあるとします。最善の解決策は何ですか?

4

2 に答える 2

1

あなたがすべてのベルトとブレースであるか、スレッドで多くの奇妙なことをしている場合は、おそらく各メソッド呼び出し内で保持/解放する必要があります。実際、これはまさに ARC が舞台裏で行っていることです。(私が知る限り文書化されておらず、バージョンごとに変更される可能性があります。)

そして、確かに、あなたが提案するように保持/解放しても害はありません。実際には、多くのオーバーヘッドが追加されることはほとんどありません。

そうは言っても、ほとんどの人は保持/解放を追加しません。コードがすべてメイン スレッドで実行されている場合、メソッドの実行中にオブジェクトが解放される可能性はほとんどありません。

于 2012-10-03T08:15:18.347 に答える
0

(これは、ARCが無効になっている場合の参照カウントを説明しています)

便利なコンストラクターを使用すると、返されるオブジェクトは自動解放されたオブジェクトとして返されます。

Autorelease は、現在の実行ループの最後に、オブジェクトの参照カウントが 1 ずつ減ることを意味します。オブジェクトが作成からこの時点まで保持されていなかった場合、それは割り当てが解除されることを意味します。

これは、オブジェクトがメソッドの最後まで存続するため、コードに保持/解放呼び出しを追加する必要がないことを意味しますsomeFunction

メソッドの終わりまでにsomeFunction配列を維持する必要がある場合、たとえばインスタンス変数で、次を使用して配列を保持できます。

_myInstanceVar = [array retain]; // don't forget to release it in dealloc method
于 2012-10-03T08:14:07.837 に答える