-[NSObject performSelector:withObject:afterDelay:inModes:] documentation:
2013年11月1日の回答ドキュメントが更新されるように見える
、予想通り、今、彼らはしかし、彼らはまだ言及ターゲットオブジェクトが保持されて言っていませんrunloopの予定タイマー。
NSTimerが使用されている場合、オブジェクトは誰かによって保持されなければなりません。また、オブジェクトがまだ生存していることを誰も保証できないため、セレクタを実行できる保証はありません。 ARCのweak
を使用しない場合、クラッシュします。 私の意見では、Appleは実装の詳細は言及していませんが、ドキュメントを編集しましたが、かなり分かりやすいと思います。
上記の文書では、の保持はすべてとは言いませんが、ターゲットが保持されているわけではありません。
(lldb) p (int)[self retainCount]
(int) $1 = 8
(lldb) expr (void)[self performSelector:@selector(description) withObject:nil afterDelay:1.0]
(lldb) p (int)[self retainCount]
(int) $2 = 9
(lldb) expr (void)[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(description) object:nil]
(lldb) p (int)[self retainCount]
(int) $3 = 8
結論::オブジェクトが保持されますが、それは我々が気にすべきものではありません
これは、私はシミュレータiOS7.0でのデバッガで試行するものです。 ミスターは解決:P
前回答:を(まだ有効)
選択が行われる 後まで、この方法は、受信機と anArgumentパラメータを保持します。
オブジェクトが保持されないと、オブジェクトが実行される前に解放され、アプリケーションがクラッシュする可能性があるためです。
NSTimersを使用してメソッドを設定して起動しようとするときと同じロジックです。ターゲットオブジェクトがもう存在しない(リリースされている)場合、タイマーが実際に起動されると、アプリがクラッシュします。だから、performSelector:withObject:afterDelay:...
と、それは、タイマーが起動されたときにアプリがクラッシュしていないと確信してますので、その友人は、私たちの生活が少し楽にするためにここにいる;)
は、それはあなたが間違っていることを信じているように見える
doMeが終了したときの保持カウントは何ですか? – nacho4d