私は、ARCと、適切なライフタイム修飾子(、、、、および)を選択するための適切なユースケースについてかなりよく理解している__strong
と思い__weak
ます。しかし、私のテストでは、私には意味をなさない1つの例を見つけました。__unsafe_unretained
__autoreleasing
私が理解しているように、両方とも保持カウントを追加__weak
し__unsafe_unretained
ません。したがって、オブジェクトへの他のポインタがない場合__strong
、オブジェクトは即座に割り当て解除されます(不変の文字列はこのルールの例外です)。このプロセスの唯一の違いは、__weak
ポインターがnilに設定され、__unsafe_unretained
ポインターがそのまま残されることです。
__weak
単純なカスタムオブジェクト(1つのNSStringプロパティで構成される)へのポインターを作成すると、プロパティにアクセスしようとしたときに期待される(null)値が表示されます。
Test * __weak myTest = [[Test alloc] init];
myTest.myVal = @"Hi!";
NSLog(@"Value: %@", myTest.myVal); // Prints Value: (null)
__unsafe_unretained
同様に、結果として生じるダングリングポインターが原因で、ライフタイム修飾子がクラッシュを引き起こすと予想します。ただし、そうではありません。この次のテストでは、実際の値を確認します。
Test * __unsafe_unretained myTest = [[Test alloc] init];
myTest.myVal = @"Hi!";
NSLog(@"Value: %@", myTest.myVal); // Prints Value: Hi!
__unsafe_unretained
オブジェクトの割り当てが解除されないのはなぜですか?
[編集]:オブジェクトの割り当てが解除されています... 2〜3行目をNSLog(@"%@", myTest);
アプリのクラッシュに置き換えようとすると(最初の行の直後にオーバーライドされたが呼び出されます)dealloc
。Test
不変の文字列は、を使用しても引き続き使用可能であり__unsafe_unretained
、NSStringへの直接ポインタが機能することを私は知っています。割り当て解除されたオブジェクトにプロパティを設定でき(2行目)、後で割り当て解除されたオブジェクトへのポインターからプロパティを逆参照できることに驚いています(3行目)。誰かがそれを説明できれば、それは間違いなく私の質問に答えるでしょう。