ヒレガス本 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するだけで切り替えられる。

../../../_images/PersistantState.png

便利だ。

参考文献

  • MacOSX Cocoa プログラミング P259