3

こんにちは、みんな、

@property (nonatomic, assign) NSInteger myindex;

この行は、Objective C ARC への変換を実行した後にunsafe_unretainedに変わります。これについて説明してください。

4

2 に答える 2

2

_unsafe_unretained は変数修飾子です。

ARCドキュメントへの移行から

__unsafe_unretained は、参照先のオブジェクトを存続させず、オブジェクトへの強い参照がない場合に nil に設定されない参照を指定します。参照するオブジェクトの割り当てが解除された場合、ポインターはぶら下がったままになります。

簡単に言えば、この修飾子を使用すると、保持は行われず、保持しているオブジェクトが他にない場合でも、参照が自動的に nil に設定されることはありません。

編集:コメントを見た後

まず最初に、問題の変数はプリミティブ型 ( 、NSIntegerlikeなど) です。したがって、、、などの変数修飾子はそれらに影響を与えません。したがって、以下のコードに危険はありません。CGFloatfloat__weak__strong__unsafe_unretained

@property (nonatomic, assign) NSInteger myindex;

他の部分に、NSString、UIImage などの非プリミティブ型があり、この修飾子を使用している場合は、使用中は変数を保持し、後で解放する必要があります。

于 2012-12-03T04:13:55.630 に答える
1

あなたの場合、unsafe_unretainedそれはスカラー値であるため、変更されません。おそらくあなたは次のように書きました:

@property (nonatomic, assign) NSInteger *myindex; 

に変換しているのはそのためunsafe_unretainedです。

ARCassignでは効果的unsafe_unretainedです。

、 などのスカラー値のint場合float。それ自体を使用できますassignweakまたはのいずれかを使用できるオブジェクトの場合unsafe_unretained、コンテキストによって異なります。

unsafe_unretainedオブジェクトの保持をweak防ぎますが、方法は少し異なります。

  • weakオブジェクトの割り当てが解除されると、オブジェクトへのポインターは nil に変換されます。
  • unsafe_unretained割り当てが解除された後でも、オブジェクトがあったメモリを指し続けます。これにより、割り当てが解除されたオブジェクトへのアクセスが原因でクラッシュが発生する可能性があります。
于 2012-12-03T04:16:58.080 に答える