2003 Apple Computer, Inc. (Last Updated May 7, 2003)
@interface AppController : NSObject { IBOutlet NSArray *keywords; }
図 4-1 Interface Builder におけるアウトレットの接続 アプリケーションは 一般に そのカスタムコントローラオブジェクトとユーザインタフェー ス上のオブジェクトの間のアウトレット接続を設定しますが これらの接続は Interface Builder でインスタンスとして表現できる任意のオブジェクトの間で たとえ 2 つのカスタム オブジェクトの間でも作成できます インスタンス変数と同様に それをクラスに含めること が正しいという根拠が必要になります オブジェクトのインスタンス変数が多いほど より多 くのメモリを占有することになるためです オブジェクトを参照する別の方法がある場合 た とえば 行列のインデックス位置を通じての検索 関数パラメータとして含めることによる検 索 タグの使用による検索などができる場合は その方法を採用してください 2003 Apple Computer, Inc. (Last Updated May 7, 2003)
委任の仕組み 委任メカニズムの設計は単純です 図 1-1 委任する側のクラスには アウトレット 通常 は delegate という名前が付けられている があり このアウトレットを設定してアクセスす るメソッドも含まれています さらにそのメソッドのいくつかを宣言し 実装はしない そ れらが 簡易プロトコル を構成します 簡易プロトコルは一般に 委任する側のクラスのカ テゴリとして生じますが 委任ですべてのメソッドをプロトコルに実装する必要がないという 点で正式なプロトコルと異なります 委任は それ自身が委任する側のオブジェクトと連携し たり オブジェクトのデフォルトの動作に作用することに関心がある場合は 簡易プロトコル からなるメソッドだけを実装します 重要 委任を使っている Cocoa クラスを継承する場合 その委任をサブクラスに明示的には保持し ないでください 委任する側のオブジェクトは その委任を 所有 していると見なされてい るわけではないので それらを保持すべきではありません 慣例により Cocoa オブジェクト はそれらの委任を保持しません 図 1-1 委任のメカニズム 簡易プロトコルのメソッドは 委任する側のオブジェクトによって処理または予想された重要 なイベントに注目します このオブジェクトは これらのイベントを委任に伝達するか 進行 中のイベントの場合は委任からの入力や承認を要求することを望んでいます たとえば ユー ザがウインドウのクローズボタンをクリックすると ウインドウオブジェクトは windowshouldclose: メッセージをその委任に送信します これにより たとえばウインド ウが保存する必要のあるデータと関連している場合は 委任にウインドウのクローズを拒否ま たは延期する機会が与えられます 図 1-2 を参照 ウインドウが閉じられると ウインドウ オブジェクトはwindowWillClose: メッセージを委任に送信し ウインドウ専用のリソースを 解放するなど その時点で適切なことを実行する機会を委任に与えます
図 1-2 委任に関する現実的なシーケンス 委任する側のオブジェクトがメッセージを送信するのは 委任がそのメソッドを実装している 場合に限られるということを強調しておかなければなりません これを調べるには 最初に 委任で NSObject メソッドの respondstoselector: を呼び出します この事前のチェック が 簡易プロトコルの設計の鍵となります 委任メッセージの形式 委任メソッドの形式はあらかじめ決められています 委任メソッドは 委任を実行する Application Kit オブジェクト アプリケーション ウインドウ コントロールなど の名前 で始まります この名前は小文字で NS プレフィックスは付いていません 通常 常にで はない このオブジェクト名の次に 報告されたイベントの時間軸上での状態を示す助動詞 が続きます すなわち この助動詞は イベントが発生しそうなのか Should または Will それともすでに発生したのか Did または Has を示します この時間 軸上での区別は 戻り値を期待しているメッセージと期待していないメッセージを分類するの に役立ちます リスト 1-1 には 戻り値を期待している Application Kit の委任メソッドをい くつか示します リスト 1-1 戻り値のある委任メソッドのサンプル - (BOOL)application:(NSApplication *)sender openfile:(nsstring *)filename; - (BOOL)textShouldBeginEditing:(NSText *)textobject; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; - (NSRect)windowWillUseStandardFrame:(NSWindow *)window defaultframe:(nsrect)newframe;
1-2 void - (void) tableview:(nstableview*)tableview mousedowninheaderoftablecolumn:(nstablecolumn *)tablecolumn; - (void)applicationdidunhide:(nsnotification *)notification; - (void)applicationwillbecomeactive:(nsnotification *)notification; - (void)windowdidmove:(nsnotification *)notification; NSWindowDidMoveNotification delegate Application Kit
id wincontroller = [[NSApp keywindow] delegate]; id appcontroller = [NSApp delegate];
2003 Apple Computer, Inc. (Last Updated May 7, 2003)
通知メカニズムの仕組みは 概念的には単純です プロセスには通知センターというオブジェ クトがあり 通知のためのクリアリングハウスであり放送局の役割を果たします アプリケー ションのどこかほかの場所で発生するイベントについて知る必要のあるオブジェクトは イベ ントが発生したときに通知してくれるよう通知センターに登録します たとえば コントロー ラオブジェクトは ポップアップが選択されたときに その変化を認識してユーザインタ フェースに反映できなければなりません イベントが発生すると そのイベントを処理するオ ブジェクトが通知センターに通知を送り センターがそのオブザーバすべてに通知を配信しま す 図 3-1 にこのメカニズムを示します 注意 通知センターは そのオブザーバに同時に通知を配信します すべての通知が送信され るまで 送信側のオブジェクトには制御は戻りません 通知を非同期にブロードキャストする には 通知キューを使用する必要があります 通知キュー を参照 通知キューは 指定 された通知を遅らせ 指定された何らかの基準に従って類似した通知を結合させてから 通知 センターに通知を送信します 図 3-1 通知の送信とブロードキャスト 任意のオブジェクトが通知を送信でき 自身を通知のオブザーバとして通知センターに登録す ることができます 通知を送信するオブジェクト 通知に含まれるオブジェクト および通知 のオブザーバはすべて別々のオブジェクトでも 同じオブジェクトでも構いません 送信側 のオブジェクトと監視するオブジェクトを同じにすると アイドル時間の処理などに役に立ち ます 通知を送信するオブジェクトは オブザーバについて知る必要はありません これに 対して オブザーバは少なくとも通知名と 通知オブジェクトによってカプセル化されたディ クショナリのキーを知る必要があります 通知オブジェクトの構成については 通知オブ
- (void)notificationhandlername:(nsnotification *);
NSNotificationCenter
NSDistributedNotificationCenter NSDefaultRunLoopMode
どのスレッドにも タスクのデフォルト通知センターと結び付いているデフォルトの通知 キューがあります 独自の通知キューを作成し センターやスレッドごとに複数のキューを保 持することができます 図 3-2 通知キューと通知センター 通知の結合 NSNotificationQueue クラスは Foundation Kit の通知メカニズムに 2 つの重要な機能を提 供します すなわち 通知の結合と非同期の送信です 結合は キューに入ったばかりの通知 に類似した通知を キューから削除する処理です 新しい項目が すでにキューに入っている 通知に類似している場合 新しいものはキューには入れられず 類似した通知がすべて キューの先頭にあるものは除いて 削除されます ただし このように特殊な結合の動作に は依存しないでください 類似性の基準を指定するには enqueuenotification:postingstyle:coalescemask:formodes: メソッドの第 3 引数に以下 の定数を指定します 複数も可 NSNotificationNoCoalescing NSNotificationCoalescingOnName NSNotificationCoalescingOnSender NSNotificationCoalescingOnName と NSNotificationCoalescingOnSender 定数を
NSModalPanelRunLoopMode NSPostASAP NSPostWhenIdleNSPostNow NSPostASAP NSPostASAP draw...
NSPostASAP NSPostNow NSPostNow 2003 Apple Computer, Inc. (Last Updated May 7, 2003)
5-1 nil
nil NSApp id sender - (void)capitalizeword:(id)sender; - (IBAction) deleterecord:(id)sender; IBAction
IBAction sender nameentered: - (void)nameentered:(id) sender { NSString *name = [sender stringvalue]; if (![name isequaltostring:@""]) { NSMutableArray *names = [self namelist]; [names addobject:name]; [sender setstringvalue:@""]; } } [sender selectedrow] [sender state] [[sender cell] tag] Application Kit
図 5-2 Interface Builder におけるターゲットとアクションの設定 アクションがカスタムクラスのスーパークラスまたは既製の Application Kit クラスによって 処理される場合は 最初のステップは省略できます もちろん アクションメソッドを自分で 定義する場合は 必ずそれを実装する必要があります アクションとターゲットをプログラムで設定するには 次のメソッドを使ってメッセージをコ ントロールまたはセルオブジェクトに送信します - (void)settarget:(id)anobject; - (void)setaction:(sel)aselector; 次の例は これらのメソッドの使い方を示しています [acell settarget:mycontroller]; [acontrol setaction:@selector(deleterecord:)]; [amenuitem setaction:@selector(showguides:)]; ターゲットとアクションをプログラムで設定するのはメリットがあり 実際に 一定の状況で は考えられる唯一のアプローチになることもあります たとえば ネットワーク接続の有無や インスペクタウインドウのロードなど 実行時の状況に応じてターゲットやアクションを変化
2003 Apple Computer, Inc. (Last Updated May 7, 2003)
KeyKey KeyisKeykey key
2-1 - (id)tableview:(nstableview *)tv objectvaluefortablecolumn:(id)column row:(int)row { Employee *emp = [employees objectatindex:row]; if ( [[column identifier] isequaltostring:@ name ] ) { return [emp name]; } if ( [[column identifier] isequaltostring:@ dept ] ) { return [emp department]; } if ( [[column identifier] isequaltostring:@ title ] ) { // etc... } // etc... } 2-2 - (id)tableview:(nstableview *)tv objectvaluefortablecolumn:(id)column row:(int)row { Employee *emp = [employees objectatindex:row]; return [emp valueforkey:[column identifier]]; }
2003 Apple Computer, Inc. (Last Updated May 7, 2003)
2003 Apple Computer, Inc. (Last Updated May 7, 2003)