0

私はこれが以前に(ある種の)答えられたことを知っていますが、割り当てによって具体的にサブクラス化されていないオブジェクトを解放するタイミングとタイミングについて、矛盾する答えを読んでいます。

たとえば、次のようにすると、次のようになります。

@property (..., retain) NSMutableArray *myArray;

または一般的に、

@property (some retain attribute - strong, weak, retain) type myObject;

合成後、myObjectに対して他に何もしなかった場合(割り当てがない、または使用するのを忘れた場合)、それを解放する責任がある場合はありますか?

4

1 に答える 1

3

ARC を使用しているかどうかによって、2 つのまったく異なる答えがあります。ARC環境は非常に単純なので、ARC以前の観点からお答えします。理解しておくべき主なことは、プロパティ保持セマンティクスに関するすべての話は、主なポイントから気を散らすだけだということです。所有権の放棄は、 を介して行われ-releaseます。では、「所有権を取得するとはどういうことか」を理解する必要があります。

new慣例により、[ 、allocretain、 ]のいずれかを含むクラスにメッセージを送信すると、copyそのオブジェクトの所有者になります。コンパイラは、指定した所有権ポリシーに応じて、Objective C プロパティのセッター メソッドを生成します。例えば...

@property (..., retain) NSMutableArray *myArray;
@synthesize myArray = _myArray;

これにより、次のようなメソッドが生成されます1 :

- (void)setMyArray:(NSMutableArray *)myArray
{
    // This is oversimplified, just to illustrate the important point.
    // Again, this is NOT the way a setter would actually be synthesized.
    [_myArray release];
    _myArray = [myArray retain];
}

したがって、 のようなことを言うとself.myArray = someArray、保持メッセージを に送信したことがわかり、someArray後でそれを解放する責任があります。これを行う理想的な方法はself.myArray = nil、保持する前に古い値を解放するためnilです。myArrayプロパティに何も設定していない場合でも、メッセージを送信しても問題ないため、そのメッセージを送信しても完全に安全であることに注意してくださいnil。そのため、使用方法に関係なく、使用済みのプロパティを常にに設定するのが一般的です。nil


1アクセサーが実際にどのように機能するかについては、この記事を参照してください。

于 2012-06-19T15:40:59.247 に答える