UIView
この新しいクラスのインスタンス メソッドのいずれかでサブクラス化する場合は、次のようにします。
[self removeFromSuperview];
[foo someMessage];
_a = _a + 1;
self.b++;
for (int i = 0; i < 100000000; i++) {
self.b++;
//NSLog(@"b is %i", self.b);
}
何が起こるか?スーパー ビューがこのビューの所有権を主張している唯一のビューであると仮定すると、self
すぐに割り当てが解除されますか?
foo
最初の行は、外部オブジェクトを参照するローカル変数メッセージを送信していますsomeMessage
。2 行目はローカル変数です_b
。3 行目はプロパティb
です。そして、次の数行は、少し遅れているだけです。
Xcode 4.5 と iPhone 5 (iOS 6) で試してみると、コードは実際にクラッシュすることなく実行されます。コードは の中で行われました-touchesBegan
。ビューは、大きな遅延ループが終了した後にのみ画面に表示されなくなります。これはおそらくメイン ループが現在呼び出しているdrawRect
ためでrootViewController.view
あり、ビューが表示されなくなったことを示しています (ビューは遅延ループの前にビュー階層から消えましたが、反映されていません)。画面はまだです)。
ループを 1000 または 10000 までしかカウントしないようにし、NSLog
そのループの内側を使用すると、数値は実際にはクラッシュせずにうまく出力されます。更新:しばらくの間はオブジェクトにアクセスできる可能性があると言われていますが、30 秒または 1 分間でもコードは問題なく実行されているようです。
では、これはどのように機能するのでしょうか。Instruments を使用している場合、このFooView
オブジェクトが「割り当て」テーブルから離れたのは、大きな遅延ループの後であることがわかります。FooView
そのため、 の時点ではなく、後でオブジェクトの割り当てが解除されなかったように見えるのは奇妙ですremoveFromSuperView
。
私も[self.presentingViewController dismissViewControllerAnimated ...]
を却下しself
、次の行self.presentingViewController
が再び使用され、 にself.presentingViewController
なりましnil
たが、ループを追加して 10000 の整数プロパティをインクリメントし、 を使用して出力するNSLog
と、それもうまく出力されました。