| トップ | 読書感想文 | Ukki |
Objective-Cメモ
Objective-Cメモというタイトルのページですが、Cocoa/XCodeなども今のところ同じページにごっちゃになっています。ご了承ください。

Cocoa binding

バインディング(binding)は、modelとviewとの同期を取る役割を果たす。modelに加えれラタ変更はviewに反映され、viewでユーザーが行った操作はmodelに反映される。

コンストラクタ・デストラクタの定型処理

自分用のサブクラスを作った場合のコンストラクタ・デストラクタはこんな風に書くことが多い。

- (id) init {
  self = [super init];
  myMemberVariable = [[ClassForMyMember alloc] init];
  return self;
}
- (void) dealloc {
  [myMemberVariable release];
}

My search query: [Objective-C typical constructor destroctor]

(2007/01/15)

NSMatrixに追加した新しいセルが表示されない場合

NSMatrixには、NSMatrix:renewRows:columnsで新しいセルを必要に応じて追加することができるが、それだけだとデータは正しく準備されているのに新しいセルは画面には表示されなかった。

解決方法
NSMatrix:setToCellsを呼んで、NSMatrixのフレーム大きさを自動再設定する必要がある。以下のコードでうまく動いている。
  [matrix renewRows:rows columns:cols];
  [matrix sizeToCells];
  [matrix setNeedsDisplay:YES];

My search query: [NSMatrix new cell not displayed]

(2007/01/15)

NSViewのサイズをウィンドウに連動させる

親ウィンドウのサイズが変わった時、それに連動させてNSViewのサイズを変更したい場合、Interface Builder(IB)で以下のように操作すれば良い。

- リサイズさせたいviewを選択する。
- Inspectorを表示する([Tool]-[Show Inspector])
- Inspectorのウィンドウタイトルが操作したいviewになっていることを確認する。なっていなければviewの選択が失敗していて、ほかのものが選択されている。
- ドロップダウンからsizeを選択する。
- 下半分に表示されているautosizingのところで、ウィンドウの中側の線をクリックし、バネに変える。下記スクリーンショットを参照。


外側の線もバネにできるのだが、こちらはviewのサイズは固定のまま、配置を常にウィンドウの中心にしたいという場合に使える。

動作させるとこんな感じ


#内側の線がクリックできることに気づくまでかなり掛かりました。Interface Builderのマニュアルを読んでみてようやく分かりました。

文字列をダンプする

デバッグメッセージの出力にはNSLog()関数を使う。NSLogはprintfのようなフォーマット文字列が使えるが、NSStringをフォーマットするためには、%sではなく%@を使う。

int i = 0;
NSString* class_name = ...;
NSLog(@"%d: %@\n", i, class_name);

フォーマット文字列に@を付け忘れ""としているとsegfaultする。また、NSStringを%sで出力すると何も表示されなかったりする。

文字列リテラル

@"string"は、NSStringオブジェクトを定義する。



未整理


responderとはイベントを受信することができるオブジェクトのこと。NSResponderクラスを継承している。


alert: application-modal
alert sheet: window-modal
sheetは、特定のwindowに関連づいている。

outlets
あるオブジェクトが別のオブジェクトを参照する必要がある場合は、参照先のオブジェクトのポインタをメンバ変数として持つ場合が一般的。この実装がうまく動作するためには、メンバ変数の初期化を適切に行う必要がある。この初期化作業をInterface Builderにやらせるのがoutlet。outletには型修飾子(type qualifier)のIBOutletがつく。



ウィンドウのリサイズに反応する
resizeWithOldSuperviewSize
NSViewBoundsDidChangeNotification

Objective-Cは、threadプログラミングをサポートしている。



疑問:directiveって何?

compiler directive

compilerへのdirective。Obj-Cの場合は、@で始まる。

たとえば、
  @interface, @end

class method
instance method

戻り値を指定しなければデフォルトの型であるidが返される。

Dynamic Binding
runtimeにどのオブジェクトがこのメッセージを受けるかが決まる。

respondsToSelector:メソッドは、NSObjectクラスで定義されている。

Category: 既存のクラスにメソッドを追加できるようにする方法。
Category method: できることは通常のメソッドと同じ。

Protocol: 特定のメソッド群を用意していることを必須として、様々なクラスをグループ化する。これによって、それらのクラスがクラス階層を為していなくてもよくする。protocolをサポートするクラスはそのprotocolにadpotしたという。

selector
- selectorは、_cmdでアクセスできる。
- selectorはたぶんmethodをselectする。

オブジェクトには必ずポインタでアクセスする。


Macの開発環境のひとつであるCocoaは、Objective-Cを主な開発言語としている。このObjective-Cという言語はC言語をベースに開発されたオブジェクト指向言語だが、同じルーツを持つC++とはまったく違っている。C++が構造体を拡張する形でオブジェクト指向を導入したのに対し、Objective-Cではメッセージパッシングの仕組みを導入した形でオブジェクト指向化がなされた。

面白いのはプログラムの文法がCとは大きく違って見えるにも関わらず、Objective-Cによる言語の拡張はC++に比べてごくわずかなことだ(確認はしていないが)。確かに最初にちょっとヘンな文法に惑わされるかもしれないが、慣れてくるととてもシンプルに作られていることがわかる。

しかし、Objective-Cの拡張のシンプルさとは裏腹に、プログラムを書いている感覚は、CやC++のプログラムを書いているのとは全然違う。むしろ、書いている感覚はPythonなどのスクリプト言語に近い。そのように感じる理由は、型に縛られないからであろう。


NSMatrix

drag操作を受け付けるには、registerForDraggedTypesでpasteboard typesを登録する必要がある。NSDraggingDestinationプロトコル(informal protocol)のメソッドをいくつか実装する。→pasteboard typeって何?

[sender draggingPasteboard]

http://developer.apple.com/documentation/Cocoa/Conceptual/DragandDrop/Concepts/dragdestination.html#//apple_ref/doc/uid/20000977-BAJBJFBG

alloc message - an instance is allocated, but not initialized.
init message - initialize
release message - telling an instance that I'm no longer using it.  Reference count is decreased by one.  release message may trigger destroying an instance, as it may be the last reference.
dealloc message - an instance receives it when it is about to be destroyed after release.

First Responderって何だ?
イベントで生じたアクションを受け取るオブジェクトを動的に決める時に使うplaceholderがFirst Responder。例えば、メインメニューのCutメニューアイテムが選ばれた時に発生するアクションでは、現在選択されているウィンドウ(というかビュー)に対してcutアクションを送れると都合がいい。First Responderを使えばこれが可能になる。First Responderの受け取るアクションについて、実際に反応するオブジェクトがあるかはInterface Builderは知らない。これは動的に決定されるため、実行時にこのアクションを受け取るオブジェクトが決まる。したがって、エラーがあってもInterface Builderでは検知できない。

Top
Index
Search on Ukki

login

Sections:
Cocoa binding
コンストラクタ・デストラクタの定型処理
NSMatrixに追加した新しいセルが表示されない場合
NSViewのサイズをウィンドウに連動させる
文字列をダンプする
文字列リテラル
未整理