2011年5月21日土曜日

Cocoa FileManager Tab削除の挙動 NSNotificationCenter removeObserver

Tabを削除したら当然Tabに乗っていたオブジェクトも削除される。ってことはいわゆるカウンタ方式のメモリ管理でなにかまちがいがあるのかしらん、といろいろ調べてみる。

しかし不用意なautoreleaseもないようだし、わざわざretainと書いてるところもない。

不具合の出現の仕方がこれまた不規則で、Tab削除後、TableViewの行をダブルクリックした時に発生するところまではわかっていたが、「このオブジェクトにこんなセレクタはないぞ」と怒られるだけの時や、いきなりアプリが落ちる時や、よくわからない挙動をする。

「そんなセレクタはない!」と怒るときのメッセージをよくよくみると、特定のNotificationのaddObserverで登録してあるセレクタだった。うーむ、ということは・・・addObserverしたNotificationを、オブジェクトが消えるときにちゃんとremoveしていない・・・。うおー、また単純なミスだった。

荻原本で確かめたところ、やはりちゃんとremoveObserverしないとセレクタへのポインタが残ってしまうみたい。そのポインタがたまたま他のオブジェクトを指していたときは「そんなセレクタはない!」となり、ポインタが空ならメモリエラーが発生していた、と。

コーディングを急いでいるときはこういうエラーを起こしてしまうんだなあ。もっとていねいにいかないと。

教訓:NotificationのObserverは必ず削除する

そんなんでエラーの原因がわかったところで、気分良くUserDefaultsにあれこれ記録する方法を勉強してみた。
NSRectをそのまま記録しようとして「そんなプロパティは記録できません」といわれて首をひねり、ググって
NSStringFromRect(NSRect)
に行き着く。そんなんでとりあえずこんな感じで記録できた。

そこでこれを復元するわけだが・・・NSSplitViewのスプリッタの位置、どうやって復元させるかまだわかっていない。もちろんひとつだけならInterfaceBuilderで「AutoSaveNmae」を付ければいいわけだけれど、Tabの分だけSplitViewもあるわけで、これはやっぱりSplitView上にあるSubViewの位置を全部記録する必要があるのかなあ。

明日はNavigateViewに掛かりたいけれど、果たしてそこまで行けるか。

0 件のコメント:

コメントを投稿