ヒレガス本第四版第9章 NSUndoManagerの覚え書き

NSInvocationについて

たった半ページでNSInvocationを説明をしている。予備知識が無いと理解出来ない。 NSInvocationを理解するには「詳細Objective-C 2.0第3版」 p385を参照する事。

[NSUndoManager prepareWithInvocationTarget:self]について

[NSUndoManager prepareWithInvocationTarget:self]の返り値はid型です。

この返り値がid型である為に、どのようなメッセージを投げられてもコンパイル時にはエラーにはなりません。

そのため、ヒレガス本の例にあるように簡潔にコードが書けます。

- (void) insertObject:(Person*)inPerson
   inEmployeesAtIndex:(NSUInteger)inIndex
{
    NSUndoManager* theUndoMgr  = [self undoManager];

    // この行はid型に対してメッセージを送っている
    [[theUndoMgr prepareWithInvocationTarget:self]
        removeObjectFromEmployeesAtIndex:inIndex];

    if( ![theUndoMgr isUndoing] )
    {
        [theUndoMgr setActionName:@"Add Person"];
    }

    [employees insertObject:inPerson atIndex:inIndex];
}

より防衛的に書く場合は、型チェックをすり抜ける上記のような書き方はよくない。 以下のように型を指定した書き方をした方がよい。

- (void) insertObject:(Person*)inPerson
   inEmployeesAtIndex:(NSUInteger)inIndex
{
    NSUndoManager* theUndoMgr  = [self undoManager];
    RMDocument*    theInstance = [theUndoMgr prepareWithInvocationTarget:self];

    // RMDocumentの型にする事で凡ミスが減る
    [theInstance removeObjectFromEmployeesAtIndex:inIndex];

    if( ![theUndoMgr isUndoing] )
    {
        [theUndoMgr setActionName:@"Add Person"];
    }

    [employees insertObject:inPerson atIndex:inIndex];
}

CodeSignが”check your system clock”とエラーを吐いたら時間を再設定する

xcodebuildをVMWareで作った仮想環境で実行したらcodeSignがまたエラーを吐いてうまく行かない。

エラーメッセージを見ると、時刻が合ってないとの事。

仕方が無いので、GUI経由でログインしてシステム環境設定>日付と時刻を開いた。自動で再設定されたよ。

次はうまくビルドされたが、GUIでログインしなければならないのはメンドクサイ。

VMWareを立ち上げっぱなしにしてれば良いのだろうか?

CodeSignが”User interaction is not allowed.”とエラーを吐いたら”security unlock-keychain”を実行する

xcodebuildをVMWareで作った仮想環境で実行したらcodeSignがエラーを吐いてうまく行かない。

ググると、keychainをアンロックする必要があるとの事だった。

GUI経由で行うと問題が無かったのはkeyChainのダイアログが出て来たのでそこで解決が出来ていたのだろう。

ssh経由でkeyChainのアンロックは

security unlock-keychain

を行えば良い。

git-ignoreの設定

ディレクトリを掘るたびに、色々と設定していたが、サブディレクトリのファイルを一括で無視する方法がはじめか有った。

「**/」で、サブディレクトリにたいして再帰的に適応してくれるそうです。

# .gitignore
**/build/
**/.DS_Store
**/*.xcodeproj/*
!**/*.xcodeproj/project.pbxproj

ディレクトリを掘るのが楽になる。