tinker運用ノート(2)
tinkerを運用するにあたっての覚え書き
tinker運用ノート(1) の続き
リンクの張り方
内部リンクの方法
拡張子なしでファイル名を書く。
適当な文 :doc:`sample/index` と書くと、sample/index.rstへジャンプするリンクを書ける。
と書く。リンク文の前後に空白を入れる事を忘れると認識してくれない。
絶対パスの例
:doc:`/2013/01/01/doubutunomori`
相対パスの例
:doc:`../../01/01/doubutunomori`
外部リンクの方法
`Sphinxを知りたい方はこちらをクリック <http://sphinx-users.jp>`_
と書く。URLの直書きもOK。
リンク文の前後に空白を入れる事を忘れると認識してくれない。
詳しくは Sphinxのサイト を参照する事。
MacPortsでbash-completion
makeファイルのターゲッットをコマンドライン補完したくなった。
調べるとbash-completionと呼ばれるスクリプトをインストールすると良いらしい事まで判った。
MacPortsでインストールしようと考えたら、デフォルトで入っているbashのバージョンが古いのでMacPotsで新しいbashに切り替える必要があるとの事。
面倒だなと思いつつインストールして設定する。
結果。大変快適。自動補完が無い環境にはもう戻れない。
- 参考URL
ヒレガス本 課題8-2
ヒレガス本第四版の課題8-2を読んで、この課題は10分も掛からないだろうと見積もりコーディングを始めるたが、デバッグに1時間もかかった。
ミスをした箇所は以下の通り。
- NSButtonからtarget/actionの設定を忘れていた
凡ミスだが、何度もボタンを押してしまった。最初に接続忘れを疑うべきだった。
- プロトコルのスペルミス
NSTableViewDataSourceプロトコルの一部をスペルミスしていた。実装がoptionalだと警告が発生しないのでミスを発見しにくい。
対策は、NSTableView.hから該当するプロトコルメソッドをCopy&Pasteするのが一番だと思う。
- [NSTableView reloadData]の呼出し忘れ
arrayへの追加削除の後には、reloadDataしないと画面がアップデートしない。
- IB上でidentifierの設定忘れ
tableCulumのidentifierを見て表示する内容を選んでいるのに、identifierが空だった。 identifierが空の時にassertを発生させた方が良いかも。
- tableCulumのidentifierをデータのKVCの名前に一致させるべきだったのを別の名前を作ってしまった。
わざわざ変換ようのディクショナリを作ってから気がついた。CoreDataが出てくるまでは定型文だったのだがすっかり忘れていた。
KeyValueCodingのメモ
ヒレガス本の復習をして自分の間違いに気がついた。
今までアクセッサメソッドを手書きする時に、必ず[NSObject willChangeValueForKey:]と[NSObject didChangeValueForKey:]を呼出していた。
KVOでそのプロパティが自動変更通知を使用している場合には不要だった。
プロパティーをKVCやドット表記でアクセスした場合だけでなく、アクセッサメソッドにも自動で変更通知をする。
おそらく内部で、メソッドの置換えを行っていて、アクセッサメソッドの前後に[NSObject willChangeValueForKey:]と[NSObject didChangeValueForKey:]の呼び出しを追加しているようだ。
なお、パフォーマンスの改善等の理由でより細かく通知を制御したい場合は手動変更通知と呼ばれる方法が存在する。
+ (BOOL) [NSObject automaticallyNotifiesObserversForKey:(NSString *)inKey]
をオーバーライドして、手動変更通知したいプロパティ名でNOを返すようにすると、そのプロパティ名は手動変更通知と見なされる。
手動変更通知にしたプロパティ名でKVOに対応させるには、アクセッサメソッドでwiiChangeValueForKeyとdidChangeValueForKeyの対を呼ばなければならない。
すいません。いままで知りませんでした。 今までかなりパフォーマンスが悪いプログラムを各地で書いていたようです。 本当にすいません。
- 参考文献
- ADCのKeyValueObserving.pdfとKeyValueCoding.pdfとヒレガス本