0

重複の可能性:
xcode 4.5.1 では、ios ARC について

これが私のコードです(アーク)

self.string1=@"aaa";
__weak NSString *temp= self.string1;

NSLog(@"string1  %@",self.string1);
NSLog(@"temp     %@",temp);

self.string1=nil;
NSLog(@"---after self.string1 = nil----");
NSLog(@"string1   %@",self.string1);
NSLog(@"temp      %@",temp);

出力は次のようになるはずだと思います。

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      (null)

ただし、xcode4.5.1で実行すると混乱します

string1  aaa
temp     aaa
---after self.string1 = nil----
string1   (null)
temp      aaa

誰でも私を助けて、temp=@"aaa" の理由を教えてください (これは __weak であり、string1=nil の後に nil にする必要があります)

編集:こんにちは、皆さん。私たちは間違った方向に議論しますか?おそらく、NSLog は Core Foundation Functions Reference で定義されています。ARC には、NSLog と同様に、コア基盤関数のパラメーターに関するいくつかの規則があります。_weak オブジェクトをパラメーターとして NSLog に渡すと、_weak が _autorelease に変更されますか?

4

1 に答える 1

5

@"aaa"はコンパイル時の定数であり、解放されることはありません。したがって、ウィーク ポインターしか持っていない場合でも、それは有効なオブジェクトです。

などを使用して実行時に作成された文字列を使用して実験を再試行するalloc / initWithFormat:と、期待どおりの結果が得られるはずです。

アップデート

これを自分でテストしましたが、まだ期待どおりに動作していないようです。この問題に関するさらなる議論がここにあります

于 2012-10-22T06:40:26.130 に答える