Objective-Cの通知(Notification)を解除するタイミング

通知を受け取る登録したら、removeObserverで解除するというのは当然なんだけど、そのタイミングをミスっててかなりハマった。
具体的には、通知を登録→ビューを削除→通知を解除→同じビューを作成、するとそのビューが通知を受け取っちゃってる。
その新しいビューも通知登録するから、メソッドが複数回同時に呼ばれた。
んでその中でNSURLクラス使ったんだけど、呼んでないはずのinitFileURLWithPath:メソッドがエラーだとデバッガに出てきた。
原因わかんねぇぇぇぇとなってたところで通知じゃね?と気づいた。

ARCを使っててビューの解放を任せてたのが失敗だった。
removeFromSuperViewメソッドを使った時点でdeallocが呼ばれるものだと思ってたから、そこで通知を解除してた。
でも実際は呼ばれてなかったので、viewWillDisappear:で解除するようにしたらうまくいった。

備忘録です。

iOSシミュレータでタスクを消すと、アプリがクラッシュする原因

Xcodeで開発してて、シミュレータや実機でテスト中、メモリリークなどの確認のためにタスクを消してみた。
(ホームボタン2回押して、アイコン長押しで。)
するとその時点でホーム画面が真っ黒になったり、アプリを起動したら黒くなったり、終了前の画面で止まってたりとおかしいことになった。
ARCにメモリ管理任せてるから、終了時のメモリ解放がうまく行ってないのか……?
と思って調べたら見つけた。

Mobile Dev. (iPhone + Objcetive C)

Xcodeの左上にあるStopボタンで、デバッグを止めればいいらしい。
あーよかった。

変数、メソッドの宣言とかのまとめ

入門書にはヘッダに宣言を書くように書いてある。
しかし、プライベートなメソッドの宣言ができないし、変数に「 @private」を付けても、このObjective-Cという言語はその変数にアクセスできるらしい。
オブジェクト指向なのにカプセル化できないという、とんでもない矛盾にぶつかったので、いろいろ調べてみた。(主に2ch)
一部自分のやり方で書いてあるとこもあるから、間違ってたりもっと良い書き方があれば教えてほすぃぃ。

続きを読む