1

次のようなforループを実行したいと思います。

 for (id object in [[MyClass methodReturningSet] allObjects]) {
      //do something
}

そのmethodReturningSetは次のようになります。

- (NSSet *)methodReturningSet {
         MyObject *object1 = [[MyObject alloc] initWithCustomInfo:info1] autorelease];
         MyObject *object2 = [[MyObject alloc] initWithCustomInfo:info2] autorelease];
         MyObject *object3 = [[MyObject alloc] initWithCustomInfo:info3] autorelease];
         MyObject *object4 = [[MyObject alloc] initWithCustomInfo:info4] autorelease];

         return [NSSet setWithObjects: object1, object2, object3, object4, nil];
}

私の質問ですが、これはメモリ管理の観点から安全ですか?

私の現在の理解では、実行ループの完了後に「オブジェクト」にリリースメッセージが送信されます。

私の最初の質問は、forループ全体が1つの単一の実行ループ内で実行されるかどうかです。

私の2番目の質問は、ループしている配列が含まれているすべてのオブジェクトへの強力な参照を保持しているため、オブジェクトが自動解放プールを介して解放メッセージを送信されるかどうかは重要ですか?

それが明確だったことを願っています。。。何かご意見は?

4

2 に答える 2

4

私の最初の質問は、forループ全体が1つの単一の実行ループ内で実行されるかどうかです。

はい。

私の2番目の質問は、ループしている配列が含まれているすべてのオブジェクトへの強力な参照を保持しているため、オブジェクトが自動解放プールを介して解放メッセージを送信されるかどうかは重要ですか?

NSSet、渡されたオブジェクトを保持します。オブジェクトを追加した後、不要になった場合は独自の参照を解放できます。これは、セットに追加した後の通常のリリース呼び出し(以下を参照)、または行ったように自動リリース呼び出しのいずれかです。を解放するNSSetと、そのすべてのオブジェクトも解放されます(この場合はdealloc)。

通常のリリースメッセージを使用して、次のようにすることができます。

- (NSSet *)methodReturningSet {
     MyObject *object1 = [[MyObject alloc] initWithCustomInfo:info1];
     MyObject *object2 = [[MyObject alloc] initWithCustomInfo:info2];
     MyObject *object3 = [[MyObject alloc] initWithCustomInfo:info3];
     MyObject *object4 = [[MyObject alloc] initWithCustomInfo:info4];

     NSSet *set = [NSSet setWithObjects: object1, object2, object3, object4, nil];

     [object1 release];
     [object2 release];
     [object3 release];
     [object4 release];

    return set;
}

そうは言っても、自動参照カウント(ARC)の使用を検討してください。

于 2012-11-19T21:44:20.823 に答える
1

私の最初の質問は、forループ全体が1つの単一の実行ループ内で実行されるかどうかです。

はい。

私の2番目の質問は、ループしている配列が含まれているすべてのオブジェクトへの強力な参照を保持しているため、オブジェクトが自動解放プールを介して解放メッセージを送信されるかどうかは重要ですか?

オブジェクトを明示的に使用または解放しても、オブジェクトautoreleaseによっても保持されるため、違いはありません。NSSetしたがって、はループの全期間にわたって存続し、自動解放されたリターンスルーの割り当てが解除forされたときに解放されます。NSSetmethodReturningSet

自動リリースせず、ループのすぐ外で明示的にリリースすると、見た目が良くなる可能性がありNSSetます(ただし、ループを終了した直後に戻らない場合にのみ違いが生じます)。

于 2012-11-19T21:51:03.167 に答える