ヒレガス本 14章 課題
アプリケーションがアクティブになった時にBeep音をならせとの事。
既にapplication delegateが設定されてあるので、すごい簡単。
- (void)applicationDidBecomeActive:(NSNotification *)notification
{
NSBeep();
}
課題の問題中の、Notification文字列が違うのはわざとなのだろうか?
プロジェクトファイルは、 RaiseMan_Notification に置いておきます。
ARCって楽だと思ったら、メモリリークしてる
deallocが呼ばれないので調べてみると、巡回参照が生じているらしい。IBOutletを指定したらretainしないと思ってたら、間違いだったようだ。
以下のように、__weak指定して、巡回参照を押さえてdeallocを呼ばれるようにした。
@interface RMDocument : NSDocument { NSMutableArray* employees; IBOutlet __weak NSTableView* tableView; IBOutlet __weak NSArrayController* employeeController; }
ARCの導入でコーディング量は減ったけど、考え方は変わらない。 手続き的な表記から宣言的な表記に変わったと理解して@interfaceを書く時にメモリ管理を考えるようにするとよいのかもしれない。
もう一度、@synthesizeとか@propetyの書き方を調べ直さないとダメだな。
ヒレガス本 13章 課題
UserDefaultの値を初期値にするボタンを設置せよとの事。
PreferenceController.mに以下のようなコードを追加すれば可能。
- (IBAction) resetPreferences:(id)sender
{
NSUserDefaults* theDefault = [NSUserDefaults standardUserDefaults];
[theDefault removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[colorWell setColor:[PreferenceController preferenceTableBgColor]];
[checkBox setState:[PreferenceController preferenceEmptyDoc]];
}
しかし、バインディングを使って実装し[NSUserDefaultsController revertToInitialValues]を使えばもっと簡単に実装出来る。 ググってもそちらの方はあまりでないのはiOSにNSUserDefaultsControllerが無いからなのかもしれない。
プロジェクトファイルは、 RaiseMan_UserDefault に置いておきます。
デバッグ時に復元機能をOffにする
MacOSX10.7以降では、アプリケーションにドキュメントの復元機能が追加された。このため、初期状態から起動した時のデバッグが困難になった。
色々と面倒だなと思っていたら、XCodeにその復元機能をOffにするOptionが追加されていた。
スキーム編集ダイアログで、”Run XXX.app” -> “Options” -> “Persistant state”をON/OFFするだけで切り替えられる。
便利だ。
参考文献
- MacOSX Cocoa プログラミング P259
