こんにちは、みんな、
@property (nonatomic, assign) NSInteger myindex;
この行は、Objective C ARC への変換を実行した後にunsafe_unretainedに変わります。これについて説明してください。
_unsafe_unretained は変数修飾子です。
__unsafe_unretained は、参照先のオブジェクトを存続させず、オブジェクトへの強い参照がない場合に nil に設定されない参照を指定します。参照するオブジェクトの割り当てが解除された場合、ポインターはぶら下がったままになります。
簡単に言えば、この修飾子を使用すると、保持は行われず、保持しているオブジェクトが他にない場合でも、参照が自動的に nil に設定されることはありません。
まず最初に、問題の変数はプリミティブ型 ( 、NSInteger
likeなど) です。したがって、、、などの変数修飾子はそれらに影響を与えません。したがって、以下のコードに危険はありません。CGFloat
float
__weak
__strong
__unsafe_unretained
@property (nonatomic, assign) NSInteger myindex;
他の部分に、NSString、UIImage などの非プリミティブ型があり、この修飾子を使用している場合は、使用中は変数を保持し、後で解放する必要があります。
あなたの場合、unsafe_unretained
それはスカラー値であるため、変更されません。おそらくあなたは次のように書きました:
@property (nonatomic, assign) NSInteger *myindex;
に変換しているのはそのためunsafe_unretained
です。
ARCassign
では効果的unsafe_unretained
です。
、 などのスカラー値のint
場合float
。それ自体を使用できますassign
。weak
またはのいずれかを使用できるオブジェクトの場合unsafe_unretained
、コンテキストによって異なります。
unsafe_unretained
オブジェクトの保持をweak
防ぎますが、方法は少し異なります。
weak
オブジェクトの割り当てが解除されると、オブジェクトへのポインターは nil に変換されます。unsafe_unretained
割り当てが解除された後でも、オブジェクトがあったメモリを指し続けます。これにより、割り当てが解除されたオブジェクトへのアクセスが原因でクラッシュが発生する可能性があります。