0

私は持っています

static __weak ExplorerController *_rootExplorer = nil;

_rootExplorer = self;            
NSAssert(_rootExplorer == self, @"????");

動作します。

デアロックでは、これをやろうとしています

bool b = _rootExplorer == self;

これは誤りですが、デバッガーは両方のオブジェクトが同じであり、同じ物理アドレスを持っていることを明確に示しています。

私がする時

long n = (long) (_rootExplorer);
long n2 = (long) (self);

の場合は非常に大きな数を取得し、のn2場合はゼロを取得しnます。しかし、_rootExplorerそうではありませんnil。ただし、他の関数で同じことを行う場合は、ではなく、dealloc同じです。nn2

私のコードの何が問題になっていますか?スタック内のナビゲーションコントローラーの1つへの弱参照を維持しようとしています。巻き戻し中に、リソースを解放する必要がありますが、参照されているコントローラーのみがそれを実行できます。

4

2 に答える 2

1

Apple のARC ドキュメントには、「オブジェクトへの強い参照がない場合、弱い参照は nil に設定されます」と記載されています。 したがって、コードに問題はないと思います (... ある意味で、その場所が ARC が作業を完了した後にあることを除いて)。

于 2012-11-21T12:25:17.507 に答える
1

おそらく、_rootExplorer にメッセージを送信して、クリーンアップするように指示するつもりですか? もしそうなら、メッセージを送ってください - それが本当に nil なら、あなたのメッセージは何の害もなく無視されます。

本当に nil の場合、dealloc の前にそのように設定される原因となっているバグがどこかにある可能性があります。

接線的には、特にlldbを使用している場合、デバッガが正しい値を取得することを信頼できない場合があります。この領域には既知のバグがあります。競合も発生する可能性があります。おそらく、_rootExplorer は自分のオブジェクトとほぼ同時に割り当て解除されており、デバッガーで停止すると、発生するように見える順序がたまたま変わっただけでしょうか?

于 2012-11-21T15:56:12.920 に答える