私は Objective C の初心者で、自分では答えられない質問がいくつかあります。__weak 変数をテストするためのコード ブロックがあります (もちろん、ARC を使用しています)。
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
myString = nil; //<-- release the NSString object
NSLog(@"string: %@", weakString);
weakString は弱い変数であるため、上記のコードの出力は期待どおりです。
2013-01-02 11:42:27.481 ConsoleApp[836:303] string: (null)
しかし、コードを次のように変更すると、次のようになります。
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
NSLog(@"Before: %@", weakString); //<--- output to see if the __weak variable really works.
myString = nil;
NSLog(@"After: %@", weakString);
出力は私が期待したものとはまったく異なります:
2013-01-02 11:46:03.790 ConsoleApp[863:303] Before: John
2013-01-02 11:46:03.792 ConsoleApp[863:303] After: John
後者の NSLog の出力は、"John" ではなく (nil) である必要があります。多くのドキュメントを検索しようとしましたが、この場合の答えが見つかりませんでした。誰かが合理的な説明をすることができますか? 前もって感謝します。