完全なC互換。CocoaはObjective-CのAPI。Cocoaについて学べば必然的にObjective-Cについて学べます。主な開発環境はXcode(または旧Project Builder)。[[プログラミング言語]]
* 目次 [#z9920e6c]
#contents
*新版(構成豫定圖) [#v6dbd455]
*新版(構成予定図) [#v6dbd455]
*Objective-C [#m05c3047]
一般的な Object 指向の思想を理解してゐる前提の元に文法事項を解説。全てを粒さに讀む必要はない。Cocoa の方をやりながら文法事項を知りたいなと感じれば、外國語の學習同樣に、必要な時に必要な所を參照した方がよい。
一般的な Object 指向の思想を理解している前提の元に文法事項を解説。全てをつぶさに読む必要はない。Cocoa の方をやりながら文法事項を知りたいなと感じれば、外国語の学習同様に、必要な時に必要な所を参照した方がよい。

**豫め定義された型と變數 [#f97d4a19]
Objective-C では新たに次の樣な型が定義されてゐる(objc-class.h)。
**予め定義された型と変数 [#f97d4a19]
Objective-C では新たに次の様な型が定義されている(objc-class.h)。

-id
-SEL
-IMP
-Method
-Class
-BOOL

言語構造上の變數は 
言語構造上の変数は 

-nil
-self
-super
-YES
-NO

など馴染みの物がある。これらは一例に過ぎないし全てを遣ふわけではないから、追々説明する事になるだらう。
など馴染みの物がある。これらは一例に過ぎないし全てを使うわけではないから、追々説明する事になるだろう。

**クラス(class) [#f65cc3b7]
定義は.hファイル、實裝は.mファイルに書く。Xcode で新たに書類をプロジェクト追加する際に、Objective-C Class テンプレートを選ぶと、.hファイルと.mファイルが自然に追加される。
定義は.hファイル、実装は.mファイルに書く。Xcode で新たに書類をプロジェクト追加する際に、Objective-C Class テンプレートを選ぶと、.hファイルと.mファイルが自然に追加される。

>&color(#007900){//	 MyObject.h};~
''&color(#CB0094){@interface}; MyObject : NSObject{''~
''}''~
''&color(#CB0094){@end};''~
&color(#007900){//	MyObject.m};~
''&color(#CB0094){@implementation}; MyObject''~
''&color(#CB0094){@end};''

Objective-C では C と區別(或いは將來の互換性確保)の爲に、擴張した文法は@を附け記述する(ディレクティブ參照)。今この記述では、NSObject を繼承した MyObject クラスの定義をした事になる。
Objective-C では C と区別(或いは将来の互換性確保)の為に、拡張した文法は@を付け記述する(ディレクティブ参照)。今この記述では、NSObject を継承した MyObject クラスの定義をした事になる。

註:新たにクラスを定義する場合は、一般に NSObject を繼承したクラスを定義する。その理由は NSObject が Cocoa における一般的な手續きを全て網羅してゐるからである。またその他のクラスに於ては、特段の理由や意味がない限り、サブクラスを造らない方が良い(譬へば NSString や NSArray のサブクラスを作製しても思ふ樣にはいかないだらう)。逆に能くサブクラスを作るのは、NSObject の他に、稀だが NSApplication の場合や、或いはサブクラスを作る爲のクラス NSManagedObject 等である。
注:新たにクラスを定義する場合は、一般に NSObject を継承したクラスを定義する。その理由は NSObject が Cocoa における一般的な手続きを全て網羅しているからである。またその他のクラスに於ては、特段の理由や意味がない限り、サブクラスを造らない方が良い(例えば NSString や NSArray のサブクラスを作製しても思う様にはいかないだろう)。逆に能くサブクラスを作るのは、NSObject の他に、稀だが NSApplication の場合や、或いはサブクラスを作る為のクラス NSManagedObject 等である。

***よくサブクラスを作るスーパークラスの例 [#zef6ef3a]
-NSObject
-NSView
-NSCell
-NSWindowController
-NSViewController
-NSManagedObject

目的別に使ひわけることになる。
目的別に使いわけることになる。

*** 命名規約(クラス) [#j3e1d720]
クラスは大文字で始めねばならない。Objective-C は 大文字と小文字を峻別する。今幾つかクラス名を擧げてきたが、自身のクラスを作る際に NS を接頭辭としてはならない。NS は NeXTSTEP の略であり、今では Apple による API を區別する爲のクラス名接頭辭として「豫約」されてゐる規約である。注意して欲しい。他にも IO(Input-Output)や OS(Operating System) や CG(Core Graphics)等 API 系により、ある程度の先客があるので、紛らはしい名前は避けた方がよい。
クラスは大文字で始めねばならない。Objective-C は 大文字と小文字を峻別する。今幾つかクラス名を挙げてきたが、自身のクラスを作る際に NS を接頭辞としてはならない。NS は NeXTSTEP の略であり、今では Apple による API を区別する為のクラス名接頭辞として「予約」されている規約である。注意して欲しい。他にも IO(Input-Output)や OS(Operating System) や CG(Core Graphics)等 API 系により、ある程度の先客があるので、紛らわしい名前は避けた方がよい。

**メッセージ(message)或いはメソッド(method) [#d7cd9816]
今先程のクラスに、インスタンス變數 obj、クラスメソッド myClassMethod、メソッド myMethod を追加したとすると、
今先程のクラスに、インスタンス変数 obj、クラスメソッド myClassMethod、メソッド myMethod を追加したとすると、

>&color(#007900){// MyObject.h};~
&color(#CB0094){@interface}; MyObject : NSObject{~
   ''&color(#CB0094){id}; obj;''~
}~
''+(&color(#CB0094){void};)myClassMethod;''~
''-(&color(#CB0094){id};)myMethod;''~
&color(#CB0094){@end};~
&color(#007900){// MyObject.m};~
&color(#CB0094){@implementation}; MyObject~
''+(&color(#CB0094){void};)myClassMethod''~
''{''~
   &color(#007900){/// your code};~
''}''~
''-(&color(#CB0094){id};)myMethod''~
''{''~
   ''&color(#CB0094){return}; obj;''~
''}''~
&color(#CB0094){@end};

ヘッダにおける括弧の遣ひ方に注目して欲しい。括弧はインスタンスが保持する變數を記述する箇所で、メソッドを記述する箇所ではない。クラスメソッドは+、インスタンスメソッドは-で書き始める規則がある。以後メソッド名と共にクラスメソッドかインスタンスメソッドかを示す際には ± を以て明示する事にする。
ヘッダにおける括弧の使い方に注目して欲しい。括弧はインスタンスが保持する変数を記述する箇所で、メソッドを記述する箇所ではない。クラスメソッドは+、インスタンスメソッドは-で書き始める規則がある。以後メソッド名と共にクラスメソッドかインスタンスメソッドかを示す際には ± を以て明示する事にする。

さてメソッドは、&color(#CB0094){@}; の圍み、&color(#CB0094){@interface}; ~ &color(#CB0094){@end}; と &color(#CB0094){@implementation}; ~ &color(#CB0094){@end}; に於て記述する。文字通り定義と實裝を表す。なほ Objective-C は完全な Object 指向を目指す物ではなく實用を任とする言語であり、Ruby の Kernel Object 樣な物は無く、詰り通常の函數は C と同じ方法で定義し利用できる。だから圍みの外で函數を定義するとよい(註:C のコードとは共存できる)。
さてメソッドは、&color(#CB0094){@}; の囲み、&color(#CB0094){@interface}; ~ &color(#CB0094){@end}; と &color(#CB0094){@implementation}; ~ &color(#CB0094){@end}; に於て記述する。文字通り定義と実装を表す。なお Objective-C は完全な Object 指向を目指す物ではなく実用を任とする言語であり、Ruby の Kernel Object 様な物は無く、つまり通常の関数は C と同じ方法で定義し利用できる。だから囲みの外で関数を定義するとよい(注:C のコードとは共存できる)。

今、更にこの MyObject のインスタンスを保持した變數 receiver が存在したとすれば、二つのメソッドを呼出すには、
今、更にこの MyObject のインスタンスを保持した変数 receiver が存在したとすれば、二つのメソッドを呼出すには、

>[&color(#277075){MyObject}; &color(#13484C){myClassMethod};];~
[receiver &color(#13484C){myMethod};];

と書く(結果を取得するなど變數の扱ひは C と全く同じなので略)。Objective-C に於てインスタンスをレシーバと呼ぶが、その意味は、Objective-C に於けるメソッドの呼出され方・動作に由來する。一般に「レシーバにメッセージを送る」と謂へば、インスタンスメソッドを起動する事を意味する。
と書く(結果を取得するなど変数の扱いは C と全く同じなので略)。Objective-C に於てインスタンスをレシーバと呼ぶが、その意味は、Objective-C に於けるメソッドの呼出され方・動作に由来する。一般に「レシーバにメッセージを送る」と言えば、インスタンスメソッドを起動する事を意味する。

註:id型はObjective-Cに於て新たに定義された型の一つで、任意のレシーバを表す型である。この樣な汎用的な型については附録參照。
注:id型はObjective-Cに於て新たに定義された型の一つで、任意のレシーバを表す型である。この様な汎用的な型については付録参照。

***引數 [#j0bd7053]
引數を渡すには幾つか規則が存るが、先づ單純な一つ渡す方法を示す。今 id 型の變數 value を -myMethod に渡すとして、
***引数 [#j0bd7053]
引数を渡すには幾つか規則が存るが、まず単純な一つ渡す方法を示す。今 id 型の変数 value を -myMethod に渡すとして、

>[receiver &color(#13484C){myMethod};:value];

と書く。メソッド名の後に :(コロン)を打つて引數を書くと、レシーバにメッセージが送信される。上の定義と實裝を書き直せば、
と書く。メソッド名の後に :(コロン)を打って引数を書くと、レシーバにメッセージが送信される。上の定義と実装を書き直せば、

>&color(#007900){// MyObject.h};~
&color(#CB0094){@interface}; MyObject : NSObject{~
   &color(#CB0094){id}; obj;~
}~
+(&color(#CB0094){void};)myClassMethod;~
−(&color(#CB0094){id};)myMethod'':(&color(#CB0094){id};)val;''~
&color(#CB0094){@end};~
&color(#007900){// MyObject.m};~
&color(#CB0094){@implementation}; MyObject~
+(&color(#CB0094){void};)myClassMethod~
{~
   &color(#007900){/// your code};~
}~
−(&color(#CB0094){id};)myMethod'':(&color(#CB0094){id};)val;''~
{~
   &color(#CB0094){return}; obj;~
}~
&color(#CB0094){@end};

更に複數の引數を渡したいのならば、可變長かラベルを利用する事になる。
更に複数の引数を渡したいのならば、可変長かラベルを利用する事になる。

註:Xcode で Cocoa アプリケーションを開發するならば、メソッドを呼び出す時は、ヘッダが解析された後に入力支援システムによつて補助が入り、どこにコロンを打ちどこにどんな變數がと云ふ事を惱む必要がなくなる。だから今一番憶えておきたいのは、寧ろメソッドの記述方法である。
注:Xcode で Cocoa アプリケーションを開発するならば、メソッドを呼び出す時は、ヘッダが解析された後に入力支援システムによって補助が入り、どこにコロンを打ちどこにどんな変数がと云う事を悩む必要がなくなる。だから今一番憶えておきたいのは、寧ろメソッドの記述方法である。

***可變長引數 [#m358b846]
C における可變長と同じく、可變長引數を id 型にすれば
***可変長引数 [#m358b846]
C における可変長と同じく、可変長引数を id 型にすれば

>+(&color(#CB0094){void};)myClassMethod:(&color(#CB0094){id};)objects, ...;~

と書ける。

***ラベル(label) [#c741a9fc]
Objective-C で尤も一般的な複數引數の記述・利用法がラベルである。Objective-C では、その他の言語での引數がただの變數の羅列になるのとは對蹠的に、引數に名前を指定する。この名前をラベルと謂ふ。座標を渡すメソッドを考へたならば、
Objective-C でもっとも一般的な複数引数の記述・利用法がラベルである。Objective-C では、その他の言語での引数がただの変数の羅列になるのとは対照的に、引数に名前を指定する。この名前をラベルと言う。座標を渡すメソッドを考えたならば、

>[receiver &color(#13484C){myMethod};:val &color(#13484C){withX};:x &color(#13484C){withY};:y];~
−(&color(#CB0094){id};)myMethod:(&color(#CB0094){id};)val withX:(&color(#CB0094){int};)x withY:(&color(#CB0094){int};)y;~

と書く。ラベルの導入は code を著しく簡明にする。C の函數等で myMethod(val,num1,num2); と書くと引數の意味が取りづらいが、Objective-C では上にある樣に見目に分り易くなつてゐる。詰り打鍵數は増えるかもしれないが、それでもなほ利點が大きいと判斷された爲に、ラベルは導入されたのである。
と書く。ラベルの導入は code を著しく簡明にする。C の関数等で myMethod(val,num1,num2); と書くと引数の意味が取りづらいが、Objective-C では上にある様に見目に分り易くなっている。つまり打鍵数は増えるかもしれないが、それでもなお利点が大きいと判断された為に、ラベルは導入されたのである。

またこのラベルは同じメソッドで幾通りも用意できる。今上に示した樣なメソッドはドキュメント等では myMethod:withX:withY: と書く事で略記されてゐるが、myMethod:withX:withY:withZ: なるメソッドを作りたいと思つた時、myMethod:withX:withY: と myMethod:withX:withY:withZ: は共存できる。
またこのラベルは同じメソッドで幾通りも用意できる。今上に示した様なメソッドはドキュメント等では myMethod:withX:withY: と書く事で略記されているが、myMethod:withX:withY:withZ: なるメソッドを作りたいと思った時、myMethod:withX:withY: と myMethod:withX:withY:withZ: は共存できる。

註:一つだけの引數の場合はラベルがない樣にみえるが、次の樣な解釋ができる。卽ち上のメッセージは「myMethod:、withX:、withY: と云ふ三つのラベルを有してをり、myMethod: の如きメソッド名の樣にみえる表記はラベルを表してゐるに過ぎぬ」と謂ふ物である。つまりレシーバに引數を送信する爲には必ずラベルをつけたメッセージを送るとみれるわけ。なほラベル自體は文法上必須ではなく、メソッド名だけでも良いが、上に擧げた「見目に分り易い」ことが重要なのである。
注:一つだけの引数の場合はラベルがない様にみえるが、次の様な解釈ができる。すなわち上のメッセージは「myMethod:、withX:、withY: と云う三つのラベルを有しており、myMethod: の如きメソッド名の様にみえる表記はラベルを表しているに過ぎぬ」と言う物である。つまりレシーバに引数を送信する為には必ずラベルをつけたメッセージを送るとみれるわけ。なおラベル自体は文法上必須ではなく、メソッド名だけでも良いが、上に挙げた「見目に分り易い」ことが重要なのである。

***メソッドの上書き(override) [#b0bf19fb]
Objective-C は柔軟すぎる言語である。中にはかなり邪惡或いは病的な手段も存在するが、それらの使用は全てプログラマ委(まか)せとなつてゐる。これは Objective-C が弱い型附けである事と同じ理由であらう。今は親クラス(superclass)のメソッドを上書き(override)する方法を示す。
Objective-C は柔軟すぎる言語である。中にはかなり邪悪或いは病的な手段も存在するが、それらの使用は全てプログラマまかせとなっている。これは Objective-C が弱い型付けである事と同じ理由であろう。今は親クラス(superclass)のメソッドを上書き(override)する方法を示す。

<準備中>

註:上書きする場合はいちいちヘッダに書く必要は無いが、若し書きたいと思ふのなら、書いても問題はない。
注:上書きする場合はいちいちヘッダに書く必要は無いが、若し書きたいと思うのなら、書いても問題はない。

***命名規約(メソッド) [#q882018d]
Cocoa API を見て行くと暗默上の諒解が幾つもある。この事はもう少し後に扱ふべき内容であるから、API をみて何かあると感じた時、規約がある事を思ひ出して欲しい。
Cocoa API を見て行くと暗默上の了解が幾つもある。この事はもう少し後に扱うべき内容であるから、API をみて何かあると感じた時、規約がある事を思い出して欲しい。

今 NSString のメソッドを例にすると、

++ stringWithString:, + stringWithUTF8String:, etc.~
特別なファクトリメソッド(簡易コンストラクタと謂ふ)であり、戻り値は初期化されてゐる。接頭辭は何のオブジェクトによるが、number や array 等多岐にわたる。
特別なファクトリメソッド(簡易コンストラクタと言う)であり、戻り値は初期化されている。接頭辞は何のオブジェクトによるが、number や array 等多岐にわたる。
+− initWithString:, − initWithUTF8String:, etc.~
特別なイニシャライザ(指定イニシャライザと謂ふ)である。init で始める。ファクトリメソッドも含め、初期化手段を複數用意する場合には實態を一つに限らねばならない。初期化については後述。
特別なイニシャライザ(指定イニシャライザと言う)である。init で始める。ファクトリメソッドも含め、初期化手段を複数用意する場合には実態を一つに限らねばならない。初期化については後述。
+− doubleValue, − dataUsingEncoding:, etc.~
これも一つのファクトリメソッドだが、面白いのは NSString 以外の値を返す事と、これがインスタンスメソッドである點である。前者は double、後者は NSData を返す。上であげた命名規則と比べて欲しい。
これも一つのファクトリメソッドだが、面白いのは NSString 以外の値を返す事と、これがインスタンスメソッドである点である。前者は double、後者は NSData を返す。上であげた命名規則と比べて欲しい。
+− writeToFile:atomically:encoding:error:, − writeToURL:atomically:encoding:error:~
writeTo はデータを書き出すメソッド名である。データは NSData にするのが一般的。
+− isAbsolutePath~
眞僞値を返す場合に is で書き始める。
真偽値を返す場合に is で書き始める。
+− isEqualToString:~
isEqualTo は is だけみれば眞僞値を返す例と同じに見えるが、その利用はインスタンスの比較に限る。NSObject のメソッドを參照。
isEqualTo は is だけみれば真偽値を返す例と同じに見えるが、その利用はインスタンスの比較に限る。NSObject のメソッドを参照。
+− getLineStart:end:contentsEnd:forRange:, − getCString:maxLength:encoding:~
get は getter の樣にみえるが、これは C のポインタを渡してインスタンスから値を取得する場合に用ゐる(詰り參照渡しの)メソッドである。
get は getter の様にみえるが、これは C のポインタを渡してインスタンスから値を取得する場合に用いる(つまり参照渡しの)メソッドである。
+− UTF8String, − length, − propertyList, etc.~
Objective-C における getter は get を用ゐない。これらが getter 的なメソッドである。一方 setter は set で書き始めても構はない。詳しくは Key-Value Coding Protocol を參照。
Objective-C における getter は get を用いない。これらが getter 的なメソッドである。一方 setter は set で書き始めても構わない。詳しくは Key-Value Coding Protocol を参照。

等が即座に指摘できる。これらは順にドキュメントを讀んだりしながら、各が會得して欲しい事項である。
等が即座に指摘できる。これらは順にドキュメントを読んだりしながら、各が会得して欲しい事項である。

**レシーバ(receiver)或いはインスタンス(instance) [#x20a75d7]
Objective-C におけるインスタンスは、C のポインタである。だから變數の型にはポインタを表す * が必須である。
Objective-C におけるインスタンスは、C のポインタである。だから変数の型にはポインタを表す * が必須である。

>&color(#641D9E){NSObject}; *obj = [[&color(#641D9E){NSObject}; &color(#370071){alloc};] &color(#370071){init};];

このインスタンスたるポインタに、Objective-C の Runtime が、メッセージを送受信してオブジェクト指向たらしめてゐる。なんとなれば、id 型は void * 型と等價であると謂ふ事だが、一つだけ違ふ點は、id 型が Objective-C のレシーバであると保證してくれる事である。だから任意のクラスのレシーバを利用したい場合は id 型を用ゐるとよい。
このインスタンスたるポインタに、Objective-C の Runtime が、メッセージを送受信してオブジェクト指向たらしめている。なんとなれば、id 型は void * 型と等価であると言う事だが、一つだけ違う点は、id 型が Objective-C のレシーバであると保証してくれる事である。だから任意のクラスのレシーバを利用したい場合は id 型を用いるとよい。

***レシーバの初期化 [#jdb8da1d]
レシーバの初期化は上にあげた +alloc, -init が尤も基本的な物であるが、ファクトリメソッドが用意されることもある。遣ひ分けは後々メモリ管理で論じるが、今はメモリリークは一切氣にせずに、初期化法を考へてみる。
レシーバの初期化は上にあげた +alloc, -init がもっとも基本的な物であるが、ファクトリメソッドが用意されることもある。使い分けは後々メモリ管理で論じるが、今はメモリリークは一切気にせずに、初期化法を考えてみる。

alloc と init は NSObject(より正確には NSObject Protocol)で定義されてをり、Objective-C の根幹を成すメソッドの一つである。alloc はレシーバにメモリを割り當てるが、この alloc は上書きしてはならない。init はこれを初期化するが、自身の初期化をコードを用ゐたいならば、上書きしてもよい。
alloc と init は NSObject(より正確には NSObject Protocol)で定義されており、Objective-C の根幹を成すメソッドの一つである。alloc はレシーバにメモリを割り当てるが、この alloc は上書きしてはならない。init はこれを初期化するが、自身の初期化をコードを用いたいならば、上書きしてもよい。

註:オブジェクトの所有權についてはメモリ管理をみて欲しい。より詳しい初期化についての事はそこで述べることになる。
注:オブジェクトの所有權についてはメモリ管理をみて欲しい。より詳しい初期化についての事はそこで述べることになる。

***nil の扱ひ[#p1df9b13]
Objective-C では、nil に存在しないメッセージを送信しても、エラーが發生しない。これは通常のレシーバでは致命的なエラーとなる事と異なる結果を導くので注意して欲しい。
***nil の扱い[#p1df9b13]
Objective-C では、nil に存在しないメッセージを送信しても、エラーが発生しない。これは通常のレシーバでは致命的なエラーとなる事と異なる結果を導くので注意して欲しい。

>[&color(#CB0094){nil}; &color(#13484C){myMethod};];&color(#007900){// エラーにならない};~
[receiver &color(#13484C){myMethod2};]; &color(#007900){// myMethod2が未定義ならばエラー};

これは譬へば delegate で nil を設定しても呼出しに惱む必要がない等、ただメッセージを送信するだけの用途のコードのエラー處理を短縮する事になるだらう。
これは例えば delegate で nil を設定しても呼出しに悩む必要がない等、ただメッセージを送信するだけの用途のコードのエラー処理を短縮する事になるだろう。

**メモリ管理 [#i43c7ce1]
Objective-C のメモリ管理は「參照カウント」と「ガベージコレクション」が用意される。Mac OS X はメモリリークしたメモリであれプロセス終了時に回収してくれるが、實行時にメモリを大量に利用する場合メモリ確保が困難になるかもしれない。だからなるべくメモリリークを防ぐコードを書くべきである。ここでは參照カウントにまつはるメソッド、つまり NSObject に實裝されてゐる NSObject Protocol の +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説する。なほガベージコレクションを利用する場合は Mac OS 10.5 以降に導入され以前のバージョンと互換性がないので注意する。
Objective-C のメモリ管理は「参照カウント」と「ガベージコレクション」が用意される。Mac OS X はメモリリークしたメモリであれプロセス終了時に回収してくれるが、実行時にメモリを大量に利用する場合メモリ確保が困難になるかもしれない。だからなるべくメモリリークを防ぐコードを書くべきである。ここでは参照カウントにまつわるメソッド、つまり NSObject に実装されている NSObject Protocol の +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説する。なおガベージコレクションを利用する場合は Mac OS 10.5 以降に導入され以前のバージョンと互換性がないので注意する。

+alloc はメモリを割り當てたオブジェクトを返す。malloc 同樣確保に失敗すれば nil を返す。生成されるオブジェクトの參照カウント は 1 となる。
+init はオブジェクトを初期化する。Cocoa はこの二段構へにする事でオブジェクト生成に柔軟性を與へてゐる。
+retain はメモリ割り當てを解放しない爲の手續きである。參照カウントを 1 増やす。
+release はメモリ割り當てを解放する爲の手續きである。參照カウントを 1 減らす。
+alloc はメモリを割り当てたオブジェクトを返す。malloc 同様確保に失敗すれば nil を返す。生成されるオブジェクトの参照カウント は 1 となる。
+init はオブジェクトを初期化する。Cocoa はこの二段構えにする事でオブジェクト生成に柔軟性を与えている。
+retain はメモリ割り当てを解放しない為の手続きである。参照カウントを 1 増やす。
+release はメモリ割り当てを解放する為の手続きである。参照カウントを 1 減らす。

一般に上から順に實行する。Objective-C Runtime は、メソッドを實行し終はると、alloc で 生成したオブジェクトにメモリ解放するメッセージ [receiver release]; を自動的に送る。だから任意の瞬間にオブジェクトを解放したいのならば、retain によりカウンタを増し release によりカウンタを減らせばよい。release は參照カウントが 0 になればオブジェクトを解放してくれる。
一般に上から順に実行する。Objective-C Runtime は、メソッドを実行し終わると、alloc で 生成したオブジェクトにメモリ解放するメッセージ [receiver release]; を自動的に送る。だから任意の瞬間にオブジェクトを解放したいのならば、retain によりカウンタを増し release によりカウンタを減らせばよい。release は参照カウントが 0 になればオブジェクトを解放してくれる。

***autorelease と NSAutoreleasePool [#rf888730]
上で示した仕組みでは時に問題が起る。メソッドの戻り値としてメソッドが生成したオブジェクトを返す場合である。

>−(&color(#CB0094){id};)myMethod~
{~
   &color(#641D9E){NSObject}; *val = [[&color(#641D9E){NSObject}; &color(#370071){alloc};] &color(#370071){init};];~
   &color(#CB0094){return}; val;~
}~

今この樣なメソッドの戻り値を利用する場合を考へる。しかし Runtime によつて、このままでは val に release が送信され、取得した時點では既に解放されてゐる。假に retain してみればどうなるであらうか・・・・。
今この様なメソッドの戻り値を利用する場合を考える。しかし Runtime によって、このままでは val に release が送信され、取得した時点では既に解放されている。仮に retain してみればどうなるであろうか・・・・。

***簡易コンストラクタ [#p4a641f9]
簡易コンストラクタは autorelease されたオブジェクトを返す。

***指定イニシャライザ [#v02cdf0c]
唯一でなければならず、しかも retain されてゐるオブジェクトを返す。取得した側で責任を持ち release する必要がある。
唯一でなければならず、しかも retain されているオブジェクトを返す。取得した側で責任を持ち release する必要がある。

***戻り値の規約 [#n605ab08]
-+alloc, +allocWithZone:
-−copy, −mutableCopy, +copyWithZone:, +mutableCopyWithZone:

これらで取得する場合は、簡易コンストラクタと異なり、retain されてゐるので、オブジェクトが不用になつたならば、プログラマは release せねばならない。しかしそれ以外の手段(メソッド)で取得できるオブジェクトは autorelease されてゐる。この點に注意されたい。
これらで取得する場合は、簡易コンストラクタと異なり、retain されているので、オブジェクトが不用になったならば、プログラマは release せねばならない。しかしそれ以外の手段(メソッド)で取得できるオブジェクトは autorelease されている。この点に注意されたい。

**NSObject クラス [#g74b4db7]
Cocoa における Root class の一つ。實は NSObject のメソッドは NSObject Protocol と NSObject Class のメソッドとに分類できる。
Cocoa における Root class の一つ。実は NSObject のメソッドは NSObject Protocol と NSObject Class のメソッドとに分類できる。

註:Cocoa における Root class は NSObject Protocol を適用する事になる。NSObject Protocol には基本的なメソッドが全て列擧されてゐるから。NSProxy 等。
注:Cocoa における Root class は NSObject Protocol を適用する事になる。NSObject Protocol には基本的なメソッドが全て列挙されているから。NSProxy 等。
**プロトコル(protocol) [#z2525404]
Ruby における module みたいな奴。任意のクラスに幾らでも適用できる。Ruby module が實裝ならば、Obj-C Protocol は宣言に過ぎない。手法が明示的なる物と暗默なる物の二種類ある。
Ruby における module みたいな奴。任意のクラスに幾らでも適用できる。Ruby module が実装ならば、Obj-C Protocol は宣言に過ぎない。手法が明示的なる物と暗默なる物の二種類ある。
**カテゴリ(category) [#pd8556d6]
カテゴリは定義濟のクラスを擴張できる、Objective-C でも一・二を爭ふ邪惡で、そして便利な手段である。譬へば今 NSString に base64 encoding のメソッドをつけ加へてみたいと思ふならば、カテゴリを用ゐることで實現できる。
カテゴリは定義済のクラスを拡張できる、Objective-C でも一・二を争う邪悪で、そして便利な手段である。例えば今 NSString に base64 encoding のメソッドをつけ加えてみたいと思うならば、カテゴリを用いることで実現できる。
**サブクラス(subclass) [#ta05093a]
**プロパティ(property) [#d8670d8d]
**二三の特異な型 [#id5b20c8]
***NSRange [#j9363464]
配列なんかで用ゐる。NSMakeRange で生成できる。
配列なんかで用いる。NSMakeRange で生成できる。
***NSSize [#e22be412]
NSView 及びそのサブクラスでよく使ふことになる。NSMakeSize。
**Cocoa との關聯 [#hfb31c25]
*附録:Objective-C [#v8ad2bf8]
NSView 及びそのサブクラスでよく使うことになる。NSMakeSize。
**Cocoa との関連 [#hfb31c25]
*付録:Objective-C [#v8ad2bf8]
**ディレクティブ(directive) [#z984e5a5]
Objective-C におけるコンパイラ及びプリプロセッサへの命令について。C 標準は勿論のこと、幾らかの擴張がある。それが以下である。
Objective-C におけるコンパイラ及びプリプロセッサへの命令について。C 標準は勿論のこと、幾らかの拡張がある。それが以下である。
***コンパイラのディレクティブ [#j3225b9a]
-#import
-//

#import は #include に同じだが、一度しか讀み込まない點が異なる。// は行末迄コメントと解する。
#import は #include に同じだが、一度しか読み込まない点が異なる。// は行末迄コメントと解する。
***プリプロセッサのディレクティブ [#s52514b5]
互換性確保の爲に @ で書き始めると謂ふのは、@interface の紹介をした際に書いた。今クラス(そしてそのカテゴリ、プロトコル)を宣言する手段をみれば、
互換性確保の為に @ で書き始めると言うのは、@interface の紹介をした際に書いた。今クラス(そしてそのカテゴリ、プロトコル)を宣言する手段をみれば、

-@interface
-@implementation
-@protocol
-@end

があつて、必ず@end で宣言を閉ぢる。そのインスタンス變數の可視性は次の宣言で示す。
があって、必ず@end で宣言を閉じる。そのインスタンス変数の可視性は次の宣言で示す。

-@private
-@protected
-@public

初期設定は@protectedである。例外処理は、

-@try
-@throw
-@catch()
-@finally

@finally が強制實行部位で、あとはお馴染みか。更に特定の目的が爲、次が用意される。
@finally が強制実行部位で、あとはお馴染みか。更に特定の目的が為、次が用意される。

-@class
-@selector(method_name)
-@protocol(protocol_name)
-@encode(type_spec)
-@"string"
-@"string1" @"string2" ... @"stringN"
-@synchronized()

一往説明が必要なのは @"string" であらう(其れ以外は取り急ぎ必要がないから述べない)。@"string" は quoted な部位を NSString class のレシーバとして處理する構造である。@"abc" と書けば、abc なる文字を保持した NSString class のインスタンスが const として生成される。しかも(同じ stack であればだと記憶するが)@"string" を同メソッド内で何度呼びだしても、同じインスタンスを返してくれる。
一応説明が必要なのは @"string" であろう(其れ以外は取り急ぎ必要がないから述べない)。@"string" は quoted な部位を NSString class のレシーバとして処理する構造である。@"abc" と書けば、abc なる文字を保持した NSString class のインスタンスが const として生成される。しかも(同じ stack であればだと記憶するが)@"string" を同メソッド内で何度呼びだしても、同じインスタンスを返してくれる。

註:インスタンス變數の可視性は、コンパイラが警告を出す申しわけ程度の物であり、完全な可視性を保證するわけではない。また若し完全な可視性が實現されたとしても、カテゴリを用ゐれば、どの樣な未公開インスタンス變數であれ參照・變更が可能であり、可視性は無意味である。
注:インスタンス変数の可視性は、コンパイラが警告を出す申しわけ程度の物であり、完全な可視性を保証するわけではない。また若し完全な可視性が実現されたとしても、カテゴリを用いれば、どの様な未公開インスタンス変数であれ参照・変更が可能であり、可視性は無意味である。

註:Objective-C 2.0 から、@property, @synthesize, @optional, @required 等が追加された。
注:Objective-C 2.0 から、@property, @synthesize, @optional, @required 等が追加された。

***その他のディレクティブ [#ad539716]
言語仕樣に明るいわけではないが、譬へば NSFastEnumeration Protocol の登場以降(Mac OS X 10.5以降)では、コンパイラは C 標準にない for 文をサポートしれくれる。これもディレクティブである。たまに C 標準ではない物があるとすれば、現在のプログラミングでは一般的な表記を、實用に利する爲に取り入れた表記群であらう。
言語仕様に明るいわけではないが、例えば NSFastEnumeration Protocol の登場以降(Mac OS X 10.5以降)では、コンパイラは C 標準にない for 文をサポートしれくれる。これもディレクティブである。たまに C 標準ではない物があるとすれば、現在のプログラミングでは一般的な表記を、実用に利する為に取り入れた表記群であろう。
**NSZone と malloc [#kc372fb6]
Mac OS X のメモリ確保方法について。malloc_zone_malloc とかの話。malloc.h みて下さい。
**Xcode でのビルド [#j0dbbe0f]
Xcode は Apple による工夫によつて擧動に「癖」がある。
***對象とする Mac OS X の System [Active SDK] [#r47599da]
SDK を意識することは結構重要で、API の統廢合は結構よくある。最新の Document をみるか、API のヘッダを讀めば書いてある。LEGASY とある場合は、なるべく遣はない方がよく、新機能新API らしい物は當然互換性の障碍となるから注意である。
Xcode は Apple による工夫によって挙動に「癖」がある。
***対象とする Mac OS X の System [Active SDK] [#r47599da]
SDK を意識することは結構重要で、API の統廃合は結構よくある。最新の Document をみるか、API のヘッダを読めば書いてある。LEGASY とある場合は、なるべく使わない方がよく、新機能新API らしい物は当然互換性の障害となるから注意である。
***ビルド構成 [#zbbd002c]
恐らく debug になつてゐるので、「出荷」するときは release にするやうに。ビルド構成は、ビルド時に指定するコンパイラオプション等を保存した物で、任意に切替ることができる。
恐らく debug になっているので、「出荷」するときは release にするように。ビルド構成は、ビルド時に指定するコンパイラオプション等を保存した物で、任意に切替ることができる。
***ターゲット(target) [#f63780de]
作る實行ファイルのこと。ビルド前は存在しないから赤い文字で表記される。
作る実行ファイルのこと。ビルド前は存在しないから赤い文字で表記される。
***リンカ(linker) [#r87355c5]
***ヘッダファイル [#k4c8ea24]
***デバッガ(debugger) [#oc7dc096]
<デバッガの遣ひ方とか mark の仕方を書きたいのだけれど?>
<デバッガの使い方とか mark の仕方を書きたいのだけれど?>
***pch ファイルとプリコンパイル [#lfe69b50]
Cocoa Application では precompile と呼ばれる工程がある。pch ファイルは、C++ でもお馴染みかもしれないが、Precompiled Header の事である。precompile とは文字通り compile の前段階のことで、簡單に謂ふと、キャッシュを用意する事で Cocoa Application のビルド時間が短縮できる。Xcode でこれを編輯することは先づないので、飾り程度に認識しておくとよい。
Cocoa Application では precompile と呼ばれる工程がある。pch ファイルは、C++ でもお馴染みかもしれないが、Precompiled Header の事である。precompile とは文字通り compile の前段階のことで、簡単に言うと、キャッシュを用意する事で Cocoa Application のビルド時間が短縮できる。Xcode でこれを編集することはまずないので、飾り程度に認識しておくとよい。

ただこのキャッシュは 30MB 程度あつて輕くない。10.4 以前なら /Library/Caches/Xcode に、10.5 以降ならば /private/var/folders 下にある -Caches-/com.apple.Xcode.501 に纏まつてある。たくさん Cocoa Application を作つてゐるとこのサイズは途轍もない物になるので、不安になればたまに削除すると宜しい。尚 /private/var/folders 以下は、人によりフォルダが異なるし、501 は UID なので、若し UID が 502 ならば com.apple.Xcode.502 になる場合もあるかもしれない。
***實行環境のはなし:Architecture について(32-64bit/PPC, Intel) [#xc4cf3a9]
ただこのキャッシュは 30MB 程度あって軽くない。10.4 以前なら /Library/Caches/Xcode に、10.5 以降ならば /private/var/folders 下にある -Caches-/com.apple.Xcode.501 に纏まってある。たくさん Cocoa Application を作っているとこのサイズは途轍もない物になるので、不安になればたまに削除すると宜しい。尚 /private/var/folders 以下は、人によりフォルダが異なるし、501 は UID なので、若し UID が 502 ならば com.apple.Xcode.502 になる場合もあるかもしれない。
***実行環境のはなし:Architecture について(32-64bit/PPC, Intel) [#xc4cf3a9]
***VMX(AltiVec) と SSE [#o2008692]
**C 言語との關聯 [#q1055f75]
**C 言語との関連 [#q1055f75]
***const 及び static [#j0c52aa0]
@"string" でわかるように、const は使用可能。static は singleton で用ゐる。
***インスタンス變數の扱ひ [#j3f1c269]
インスタンス變數は C での構造體のメンバの樣に宣言運用できる。例としてあげれば、@interface 中に int nums[10]; とできる。
**メソッドの靜的呼出 [#od53fcb9]
メソッドを呼出す行爲は、レシーバの情報から函數ポインタを取出し、それを呼出してゐるに過ぎない。今 <objc/objc-class.h> を import した上で、
@"string" でわかるように、const は使用可能。static は singleton で用いる。
***インスタンス変数の扱い [#j3f1c269]
インスタンス変数は C での構造体のメンバの様に宣言運用できる。例としてあげれば、@interface 中に int nums[10]; とできる。
**メソッドの静的呼出 [#od53fcb9]
メソッドを呼出す行為は、レシーバの情報から関数ポインタを取出し、それを呼出しているに過ぎない。今 <objc/objc-class.h> を import した上で、

 id obj = [self getObject];
 Method method;
 Class class = [self class];
 SEL name = @selector(myMethod:);
 method = class_getInstanceMethod(class, name);
 #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5//	OBJC2 UNAVAILABLE
 method->method_imp(self, name, obj);
 #else
 method_getImplementation(method)(self, name, obj);
 #endif

とすれば、これは [self myMethod:obj]; と同等である。ここで #if を用ゐるのは、Method のメンバにアクセスできるのは、32 bit 環境且つ Mac OS X 10.4 以前のみだから(正確には Objective-C 2.0 で削除された仕樣であるから)。尚、メソッドを上書きしてゐなければ、self とは別のインスタンス等でも函數ポインタは同一である。若し同一かどうか不安であれば、NSLog(@"%p", method->method_imp); として確かめてみればよい。
とすれば、これは [self myMethod:obj]; と同等である。ここで #if を用いるのは、Method のメンバにアクセスできるのは、32 bit 環境且つ Mac OS X 10.4 以前のみだから(正確には Objective-C 2.0 で削除された仕様であるから)。尚、メソッドを上書きしていなければ、self とは別のインスタンス等でも関数ポインタは同一である。若し同一かどうか不安であれば、NSLog(@"%p", method->method_imp); として確かめてみればよい。

註:譬へば method を NSValue のインスタンスに格納して後々利用しようと思ふならば、name が欲しい事もある。その時は、method->method_name 或いは method_getName(method) とすればよい。
注:例えば method を NSValue のインスタンスに格納して後々利用しようと思うならば、name が欲しい事もある。その時は、method->method_name 或いは method_getName(method) とすればよい。

**參考等 [#u5f76e97]
**参考等 [#u5f76e97]
*Cocoa [#w46bc7aa]
**Xcode(舊Project Builder) [#h871a571]
Mac OS X における標準的開發環境が Xcode とそのパッケージである。
**Xcode(旧Project Builder) [#h871a571]
Mac OS X における標準的開発環境が Xcode とそのパッケージである。

**Xib (Nib) ファイルと Interface Builder [#vece2793]
Cocoa アプリケーションでは、GUI 部品(及び Controller Object)をシリアライズした Nib ファイルを讀み込むことで、GUI 生成に關するコードを必要としない開發を實現してゐる。またそれに關する Controller Object を含めることで、GUI 部品からのイベントやアクションへの對處が可能となる。
Cocoa アプリケーションでは、GUI 部品(及び Controller Object)をシリアライズした Nib ファイルを読み込むことで、GUI 生成に関するコードを必要としない開発を実現している。またそれに関する Controller Object を含めることで、GUI 部品からのイベントやアクションへの対処が可能となる。

これらのファイルは、任意の瞬間に、任意の方法で讀み込むことができる。
これらのファイルは、任意の瞬間に、任意の方法で読み込むことができる。

讀み込まれた Nib ファイルにおいては、保存されたオブジェクトがインスタンス化され、インスタンス化後に NSNibAwaking Protocol の -(void)awakeFromNib が呼ばれる。
読み込まれた Nib ファイルにおいては、保存されたオブジェクトがインスタンス化され、インスタンス化後に NSNibAwaking Protocol の -(void)awakeFromNib が呼ばれる。

***NSMainNibFile [#b82ed230]
Project 中の info.plist の NSMainNibFile、或いは Xcode でターゲットを選択し『情報』ウインドウを開き『プロパティ』タブの『主要Nibファイル』、として指定されてゐるファイル名が、Cocoa アプリケーション起動時に必ず讀み込まれる Nib ファイルである。たとへば Menu Bar に表示される Main menu は主要Nibファイル中でシリアライズされてゐる。
Project 中の info.plist の NSMainNibFile、或いは Xcode でターゲットを選択し『情報』ウインドウを開き『プロパティ』タブの『主要Nibファイル』、として指定されているファイル名が、Cocoa アプリケーション起動時に必ず読み込まれる Nib ファイルである。たとえば Menu Bar に表示される Main menu は主要Nibファイル中でシリアライズされている。

***アウトレット(Outlet)とアクション(Action) [#l95742c6]
【重要な内容ですが、ココに纏めて書きます】Outlet はインスタンス、Action はインスタンスのメソッド。

註:IBOutlet 及び IBAction は C のマクロである。IBOutlet はコンパイル時に無視され、IBAction は void * を表す。
注:IBOutlet 及び IBAction は C のマクロである。IBOutlet はコンパイル時に無視され、IBAction は void * を表す。

***コントローラオブジェクト(Controller object) [#tdf38a4a]
Interface Builder の Library に Object と呼ばれる部品があるから、それをドロップすると、立方形のインスタンスが追加される。これが尤も標準的なコントローラの追加方法である。コントローラの役目はいろいろあるが、譬へば GUI 部品へのアクションは、大抵の場合、かうして追加したコントローラに送信することになる。
Interface Builder の Library に Object と呼ばれる部品があるから、それをドロップすると、立方形のインスタンスが追加される。これがもっとも標準的なコントローラの追加方法である。コントローラの役目はいろいろあるが、例えば GUI 部品へのアクションは、大抵の場合、こうして追加したコントローラに送信することになる。

例:
+Xcode で新規プロジェクトを選擇し、適當な名前の Cocoa Application Project を作る。
+Xcode で新規プロジェクトを選択し、適当な名前の Cocoa Application Project を作る。
+次に新規ファイルを選び、ヘッダを含めて AppController クラスを追加して欲しい。AppController の superclass は NSObect でよい。
+AppController.h を編輯し、AppController クラスへ -(IBAction)myMessage:(id)sender; を追加する。
+AppController.h を編集し、AppController クラスへ -(IBAction)myMessage:(id)sender; を追加する。
+AppController.m の AppController クラスには -(IBAction)myMessage:(id)sender{NSLog(@"HELLO WORLD");} と追加する。
+MainMenu.xib を開く(恐らくテンプレート通りならこのファイル名である)。すると、File's Owner・First Responder 等と表示された Window と、別の何もない Window が表示される。
+Library の Buttons から、Gradient Button を選び、何もない Window にドラッグして乗せる。これで保存すれば、ボタンが追加されてゐる。
+Library の Object & Controller から、Object を選び追加する。今度は何もなかつた Window ではない方へ追加する。
+Library の Buttons から、Gradient Button を選び、何もない Window にドラッグして乗せる。これで保存すれば、ボタンが追加されている。
+Library の Object & Controller から、Object を選び追加する。今度は何もなかった Window ではない方へ追加する。
+次に初期設定では NSObject の インスタンスであるから、Class Identify の Class を AppController にする。
+Gradient Button の Sent Actions の selector に myMessage: を設定する。勿論ターゲットは AppController。Control-Key を押しながら、クリックしてみると・・・?

Interface Builder の遣ひ方は言葉では表現しづらい。一往全て終了したならば、「ビルドと実行」を選び、起動させる。Xcode の「実行 > コンソール」からコンソールを開き、表示されたウインドウのボタンをクリックするとメッセージが表示される筈である。このコンソールには、NSLog の出力の他にエラーメッセージ等も表示されるから、出力には常に注意を拂ふこと。
Interface Builder の使い方は言葉では表現しづらい。一応全て終了したならば、「ビルドと実行」を選び、起動させる。Xcode の「実行 > コンソール」からコンソールを開き、表示されたウインドウのボタンをクリックするとメッセージが表示される筈である。このコンソールには、NSLog の出力の他にエラーメッセージ等も表示されるから、出力には常に注意を払うこと。

參考:
参考:
-[[Cocoa Fundamentals Guide:http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/]]
-[[Cocoaアプリケーションチュートリアル:http://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjCTutorial/]]

基本的なことが書いてある。『Cocoa Fundamentals Guide > オブジェクトとの通信 > ターゲットとアクションの設定』をみること。

註:Cocoa Fundamentals Guide にもあるが、コードでアクションとターゲットを設定することもできる。 NSMainNibFile や Nib ファイルについて上で書いたように、
注:Cocoa Fundamentals Guide にもあるが、コードでアクションとターゲットを設定することもできる。 NSMainNibFile や Nib ファイルについて上で書いたように、

 //   AppController.h
 @interface AppController : NSObject
 {
       IBOutlet NSButton *button;
 
 //   AppController.m
 -(void)awakeFromNib{
       [button setTarget:self];
       [button setAction:@selector(myMessage:)];
 }

と書き加へ、定義した outlet が機能するようにボタンへ接續しておけばよい。outlet の接續を行ふことで、
と書き加え、定義した outlet が機能するようにボタンへ接続しておけばよい。outlet の接続を行うことで、
GUI 部品のインスタンスをコントローラ上で取得できるようになる。

課題:『參考』『註』を見ながら、ウィンドウに先程のボタンを無効にするボタンを新たに追加すること。新たなアクションメソッドを必要とする筈である。尚、NSButton には、superclass の NSControl において -setEnabled:(BOOL)flag が定義されてゐる。&size(9){・・・・課題風にするなら、獨立したページでチュートリアル式にした方が宜しいかもしれない。};
課題:『参考』『注』を見ながら、ウィンドウに先程のボタンを無効にするボタンを新たに追加すること。新たなアクションメソッドを必要とする筈である。尚、NSButton には、superclass の NSControl において -setEnabled:(BOOL)flag が定義されている。&size(9){・・・・課題風にするなら、独立したページでチュートリアル式にした方が宜しいかもしれない。};

***File's Owner [#mb20f88d]
Nib ファイルにはその所有者である File's Owner が必ず設定される。それは、

-NSMainNibFile においては NSApplication。
-Document-based Application の Document 用 Nib ファイルでは NSDocument のサブクラス。
-Window 用 Nib ファイルでは、NSBundle の +loadNibNamed:owner: で指定した物か、或いは NSWindowController のサブクラス。
-Custom View 用 Nib ファイルでは、適當な Object、或いは NSViewController のサブクラス。
-Custom View 用 Nib ファイルでは、適当な Object、或いは NSViewController のサブクラス。

等である。

***First Responder [#sace8878]
標準でかなり多くのアクションが Main menu から設定されてゐるが、これら全ては最終的に他のオブジェクトへの呼び出しとなる。その仕組みは responder chain と呼ばれる。
標準でかなり多くのアクションが Main menu から設定されているが、これら全ては最終的に他のオブジェクトへの呼び出しとなる。その仕組みは responder chain と呼ばれる。
**バインディング(Binding) [#d75a1c73]
**通知(Notification) [#w12f5991]
**Foundation Framework [#i8aa10b0]
**AppKit Framework [#kab41712]
Application Kit (AppKit) には、さまざまな御約束がある。ある程度馴れてくると、ヘッダをみて、通知や委讓がないか確かめたり、クラスの使ひ方がわかるようになる。
Application Kit (AppKit) には、さまざまな御約束がある。ある程度馴れてくると、ヘッダをみて、通知や委譲がないか確かめたり、クラスの使い方がわかるようになる。
**CoreData Framework [#pc166909]
**二三の重要なプロトコル [#v3043586]
***NSObject Protocol [#o8819deb]
***NSKeyValueCoding Protocol と NSKeyValueObserving Protocol [#da4d02be]
***NSFastEnumeration Protocol [#b8b87c43]
***NSCoding Protocol [#o16d5326]
***NSCopying Protocol と NSMutableCopying Protocol [#h1b3bb41]
**ローカライズ(Localization) [#k00f48e1]
**ユーザ設定 [#n90a78bb]
*附録:Cocoa [#v16754fc]
API はよく遣ふ物を特に説明する。ただし Core Data については割愛する。
*付録:Cocoa [#v16754fc]
API はよく使う物を特に説明する。ただし Core Data については割愛する。
**はじめての Programing [#h5856e04]
**Foundation Framework API [#o30e26bd]
***NSObject [#d7d63c32]
***NSString, NSMutableIString [#ya900af5]
恐らく尤も頻繁に作られるクラス。
恐らくもっとも頻繁に作られるクラス。
***NSData, NSMutableIData [#a1abb82f]
***NSDate [#ga265d51]
***NSNumber, NSValue, NSNull [#a54f450a]
NSDictionary や NSArray に int や nil や 構造體等を納めたい場合にはこれらを用ゐる。NSValue でラップできる物については @encode() 參照。
NSDictionary や NSArray に int や nil や 構造体等を納めたい場合にはこれらを用いる。NSValue でラップできる物については @encode() 参照。
***NSArray, NSMutableArray [#yba263f2]
***NSDictionary, NSMutableDictionary [#pa343d08]
***NSIndexSet, NSMutableIndexSet [#n8ef5e68]
***NSNotification, NSNotificationCenter [#ebf4eb56]
**Application Kit Framework API [#dd49e84f]
***NSButton [#fc28156d]
***NSTableView, NSArrayController [#ne46d156]
dataSource と delegate をうまく遣ひこなすこと。
dataSource と delegate をうまく使いこなすこと。
***NSOutlineView, NSTreeController [#qc8de67c]
NSTableView 同樣。
NSTableView 同様。
***NSView, NSViewController [#jbd5b15c]
カスタムビューに何か御用ですか?
***NSWindow, NSWindowController [#se2ff5b9]
key-window と main-window がある。key-window とは、Mac OS X において、唯一キーボードからの入力を受け付ける window。通常 NSWindowController のサブクラスを File's owner として nib ファイルを讀み込み NSWindow を生成することになるが、NSBundle で讀み込み生成してもよい。
key-window と main-window がある。key-window とは、Mac OS X において、唯一キーボードからの入力を受け付ける window。通常 NSWindowController のサブクラスを File's owner として nib ファイルを読み込み NSWindow を生成することになるが、NSBundle で読み込み生成してもよい。

NSWindow *w = [myView window]; BOOL ended = [w makeFirstResponder:w];
***NSDocument, NSDocumentController [#q0283a81]
Document-based Application で大活躍。[NSDocumentController sharedDocumentController];
***NSApplication [#p72048d5]
[NSApplication sharedApplication];

**參考等 [#s7e8ffef]
**参考等 [#s7e8ffef]
*Apple Developer [#k4f0a384]
**Xcode の Install と Download [#w411ca75]
**SDKs [#be042210]
**分散コンパイル [#lcac35b1]
**Document [#o447cf70]
**Open Source [#n217db5f]

*舊版 [#y05bde43]
**言語仕樣 [#oad16f3f]
要約として次に用意されてゐる。構文もまた參照せよ。
*旧版 [#y05bde43]
**言語仕様 [#oad16f3f]
要約として次に用意されている。構文もまた参照せよ。
-http://developer.apple.com/jp/Documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_950_section_1.html
-http://developer.apple.com/jp/Documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_951_section_1.html

*Cocoa とは何か [#c95819d5]
Cocoa とは、Foudation Frameworks、CoreData Frameworks、AppKit Frameworks により構成される Objective-C の API 群である。

** Foudation とは [#t2196b7a]
Foudation は、そのまま「基層」の意である。化粧をする貴方には下地(ファンデ)でおなじみ。Cocoa で尤も酷使される可哀想なやつ。一方で、これの扱ひになれれば Cocoa API はグつとわかりやすいものになる。
Foudation は、そのまま「基層」の意である。化粧をする貴方には下地(ファンデ)でおなじみ。Cocoa でもっとも酷使される可哀想なやつ。一方で、これの扱いになれれば Cocoa API はグっとわかりやすいものになる。

抽象的で申し訣ないが、要するには Cocoa の頻出データ型を定め頻出する機能を纏めたやつである。MVC でいへば Model の提供が主で Controller の技術的補助(オブザーバなど)、View に渡すデータなどの役割を擔ふ健氣なやつ。
抽象的で申し訳ないが、要するには Cocoa の頻出データ型を定め頻出する機能を纏めたやつである。MVC でいえば Model の提供が主で Controller の技術的補助(オブザーバなど)、View に渡すデータなどの役割を担う健気なやつ。

** AppKit とは [#e8646e9f]
AppKit は、ApplicationKit の略である。Kit の接尾辭は Apple では擴張的であれど基本的な API 群につけるらしく、たとへば Safari の KHTML エンジンは WebKit Frameworks で實裝される。Cocoa にラップされた QuickTime API は QTKit である。
AppKit は、ApplicationKit の略である。Kit の接尾辞は Apple では拡張的であれど基本的な API 群につけるらしく、たとえば Safari の KHTML エンジンは WebKit Frameworks で実装される。Cocoa にラップされた QuickTime API は QTKit である。

感覺を摑むためにも、まづは手元にある Interface Builder を起動させてみて欲しい。起動せば何か作るかと聞いてくるから、Cocoa > Window を選ぶ。Untitled とある畫面にはタブがあり、Instances といふタブが選擇されてゐるはづである。
Cocoa > Window の nib テンプレートには File's Owner、First Responder、Window とある訣だが、Window のアイコンをダブルクリックして欲しい。
君の目の前には眞つ白な「ウインドウ」が現れるだらう。多分表示されてゐると思ふけれど、パレットが無ければメニューから「Tools > Palettes > Show Palettes ⌘/」を選びたまへ。次にこれもおそらく表示されてると思ふけど、パレットにカラフルなイラストで彩られた上段のタブなければ、右上のボタンで表示するやうに。
感覚をつかむためにも、まずは手元にある Interface Builder を起動させてみて欲しい。起動させれば何か作るかと聞いてくるから、Cocoa > Window を選ぶ。Untitled とある画面にはタブがあり、Instances というタブが選択されているはずである。
Cocoa > Window の nib テンプレートには File's Owner、First Responder、Window とある訳だが、Window のアイコンをダブルクリックして欲しい。
君の目の前には真っ白な「ウインドウ」が現れるだろう。多分表示されていると思うけれど、パレットが無ければメニューから「Tools > Palettes > Show Palettes ?/」を選びたまえ。次にこれもおそらく表示されてると思うけど、パレットにカラフルなイラストで彩られた上段のタブがなければ、右上のボタンで表示するように。

さあ簡單に説明しよう。これが Cocoa AppKit のインスタンス君たちである。ツベコベいはず、Controls、Text、Data、Containers などの名前付きのタブから部品をマウスで選び、先程私がダブルクリックしろと言ひ散らして君が放つたらかしにしてる「ウインドウ」にドラッグドロップせよ。
あないみじ。何か表示されるね? ああ、されないなら君の Mac OS X Developer Tools は缺陷品だから、抗議の電話をしたまへ。
さあ簡単に説明しよう。これが Cocoa AppKit のインスタンス君たちである。ツベコベいわず、Controls、Text、Data、Containers などの名前付きのタブから部品をマウスで選び、先程私がダブルクリックしろと言い散らして君が放ったらかしにしてる「ウインドウ」にドラッグドロップせよ。
あないみじ。何か表示されるね? ああ、されないなら君の Mac OS X Developer Tools は欠陥品だから、抗議の電話をしたまえ。

これが "インスタンス" だ。君がこれから作るアプリケーションはこの Interface Builder で概觀をデザインすることになる。
これが "インスタンス" だ。君がこれから作るアプリケーションはこの Interface Builder で概観をデザインすることになる。

なほこの インスタンス 豫定部品君たちは Cocoa の高度な抽象化により、君がコードで宣言しなくても Mac OS X によつて勝手に初期化されて表示されることになる。君はではこれの値を變へるにはどうすれば、と思ふだらうから簡單にいふと、委讓關係を設定するか Binding を利用するかになる。恐ろしいことにこれも全て Interface Builder で且つグラフィカルに設定できてしまふ。
先程ウインドウに君はインスタンスを載せた。ボタンやらコンテナやらである。control キーを押し乍らそのインスタンス部品をクリックしてマウスを動かしてみれ呉れ。何か線がニョロニョロ出てくるだらう? これが委讓關係を設定する一つの手段である。細かい事は割愛しようと思ふが、便利でわかりやすいけどわかりにくい構造とならしめてゐる Interface Builder の一端が垣間みれたのではないかな。
なおこの インスタンス 予定部品君たちは Cocoa の高度な抽象化により、君がコードで宣言しなくても Mac OS X によって勝手に初期化されて表示されることになる。君はではこれの値を変えるにはどうすれば、と思うだろうから簡単にいうと、委譲関係を設定するか Binding を利用するかになる。恐ろしいことにこれも全て Interface Builder で且つグラフィカルに設定できてしまう。
先程ウインドウに君はインスタンスを載せた。ボタンやらコンテナやらである。control キーを押しながらそのインスタンス部品をクリックしてマウスを動かしてみれくれ。何か線がニョロニョロ出てくるだろう? これが委譲関係を設定する一つの手段である。細かい事は割愛しようと思うが、便利でわかりやすいけどわかりにくい構造とならしめている Interface Builder の一端が垣間みれたのではないかな。

すでに他のオブジェクト指向を味はつた貴方に説明するなら、これは Key-Value Coding Protocol(KVC)、Key-Value Observing Protocol(KVO) が活躍することになる。KVC は setter、getter、そして KVO は Observer パターンを實裝するもので、NSObject をルートとするクラスには自動的に備はる機能になつてゐる。protocol は Ruby 的な感じだと規約に當たる物で、かうしませうといふ感じのメソッドの一群。protocol は Objective-C の文法的要素でもある。protocol を實裝したクラスは、protocol の規約に從ひメソッドを定義せねばならない。ただしこれはインスタンスの構造に變更を加へるときのみ必要なだけで、單純に NSObject を繼承したクラスでは KVC の protocol に適合してゐることになる。
すでに他のオブジェクト指向を味はった貴方に説明するなら、これは Key-Value Coding Protocol(KVC)、Key-Value Observing Protocol(KVO) が活躍することになる。KVC は setter、getter、そして KVO は Observer パターンを実装するもので、NSObject をルートとするクラスには自動的に備わる機能になっている。protocol は Ruby 的な感じだと規約に当たる物で、こうしましょうという感じのメソッドの一群。protocol は Objective-C の文法的要素でもある。protocol を実装したクラスは、protocol の規約に従ひメソッドを定義せねばならない。ただしこれはインスタンスの構造に変更を加えるときのみ必要なだけで、単純に NSObject を継承したクラスでは KVC の protocol に適合していることになる。

先程載せたインスタンスらは nib ファイルに格納し保存される。インスタンスは [[plist 形式>プログラミング言語/Objective-C/Property List]]でシリアライズされてをり、Mac OS X のアプリケーションは起動時にこれを參照し復元して GUI 環境を提供してくれる。plist は Foudation の一部のクラスをシリアライズする物で記法は三種類ほど存在する。よく使ふので別項で解説する。nib ファイルはアプリケーションバンドルに必ずあるので、「パッケージの内容を表示」して探してみて欲しい。
先程載せたインスタンスらは nib ファイルに格納し保存される。インスタンスは [[plist 形式>プログラミング言語/Objective-C/Property List]]でシリアライズされており、Mac OS X のアプリケーションは起動時にこれを参照し復元して GUI 環境を提供してくれる。plist は Foudation の一部のクラスをシリアライズする物で記法は三種類ほど存在する。よく使うので別項で解説する。nib ファイルはアプリケーションバンドルに必ずあるので、「パッケージの内容を表示」して探してみて欲しい。

MVC でいへば、まさしく View を擔當することは先程の Interface Builder でよくわかつたかと思ふ。Controller もちょっち擔當。
MVC でいえば、まさしく View を担当することは先程の Interface Builder でよくわかったかと思う。Controller もちょっち担当。

** Core Data とは [#kb9a80ed]
Core Data は、WebObjects の EOF(Enterprise Objects Framework)の流用である。さつぱりわからん? まあ聞いてくれ。Core ImageだとかCore Audio、Core Video、などのイメージがあるので、私はハードウェア的な實裝なのかとつい勘違ひしたが、これは頗るソフトウェア的である。Core の接頭辭は Carbon API のやうに C で實裝された API をラップする存在に附けられるやうである。先述の Foudation は Carbon API の Core Foundation をラップする。これらは、高速化を圖るための思はれる。
Core Data は、WebObjects の EOF(Enterprise Objects Framework)の流用である。さっぱりわからん? まあ聞いてくれ。Core ImageだとかCore Audio、Core Video、などのイメージがあるので、私はハードウェア的な実装なのかとつい勘違いしたが、これはすこぶるソフトウェア的である。Core の接頭辞は Carbon API のように C で実装された API をラップする存在に付けられるようである。先述の Foudation は Carbon API の Core Foundation をラップする。これらは、高速化を図るための思われる。

WebObjects はマイナーの嫌ひがあるので説明せば、Mac OS X に無料でバンドルされる Java Servlet の類ひである(なほ元々は純粹なobjcだつたがversion.5よりJavaになつた)。EOF は WebObjects の賣りのひとつで、 サーバ毎に Adaptor を巧みに遣ひわけ猶且つ SQL をデヴエロツパが書く事無くして DataBase を操作する代物であつた。
WebObjects はマイナーの嫌いがあるので説明せば、Mac OS X に無料でバンドルされる Java Servlet の類いである(なお元々は純粹なobjcだったがversion.5よりJavaになった)。EOF は WebObjects の売りのひとつで、 サーバ毎に Adaptor を巧みに使いわけなおかつ SQL をデベロッパが書く事無くして DataBase を操作する代物であった。

Core Data は、主に書類を扱ふ際に威力を發揮する。EOF との違ひは、EOF は Java Servlet といふ用途に沿ふ實裝だが、Core Data はデスクトップアプリケーションの爲の API であるといふことである。そこらへんのことは Apple の Core Data の解説に詳しい。
Core Data は、主に書類を扱う際に威力を発揮する。EOF との違いは、EOF は Java Servlet という用途に沿う実装だが、Core Data はデスクトップアプリケーションの為の API であるということである。そこらへんのことは Apple の Core Data の解説に詳しい。

** 總括 [#g7b6c91b]
長くなつたけど、序論である。AppKit に項目を割いたのは Cocoa GUI に於いてとても重要であるからである。
** 総括 [#g7b6c91b]
長くなったけど、序論である。AppKit に項目を割いたのは Cocoa GUI に於いてとても重要であるからである。

また、下記リファレンスの URI に於いて CoreData を除き「ObjC_classic」とあるのは何故かと思はれるかも知れないので付け足して置くと、Foundation と AppKit は OPENSTEP 時代からの遺産であつて、Core Data は Mac OS X Tiger(v.10.4) より導入されたに過ぎない。
ゆゑにクラシックなのである。
また、下記リファレンスの URI に於いて CoreData を除き「ObjC_classic」とあるのは何故かと思われるかも知れないので付け足して置くと、Foundation と AppKit は OPENSTEP 時代からの遺産であって、Core Data は Mac OS X Tiger(v.10.4) より導入されたに過ぎない。
ゆえにクラシックなのである。

** API リファレンス(見出し) [#ae4678a7]
-http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/
~Foundation Framework Reference
-http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/ObjC_classic/
~AppKit Framework Reference
-http://developer.apple.com/documentation/Cocoa/Reference/CoreData_ObjC/
~CoreData Framework Reference

** 參考 [#y3037383]
** 参考 [#y3037383]
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/CocoaBindings/
~Cocoa バインディング入門(邦譯版)
~Cocoa バインディング入門(邦訳版)
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CoreData/
~Core Data プログラミングガイド(邦譯版)
~Core Data プログラミングガイド(邦訳版)
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueCoding/
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/KeyValueObserving/
~「キー値コーディング」及び「キー値監視」について(邦譯版)
~「キー値コーディング」及び「キー値監視」について(邦訳版)
-http://journal.mycom.co.jp/special/2005/cocoamvc/
~Core Data のレビュー記事。KVC、KVO、Cocoa Bindingにも觸れる「TigerのCocoaにみるMVCの完成 - スマートなデータモデルを実現するCore Data」(マイコミジャーナル・コラム)
~Core Data のレビュー記事。KVC、KVO、Cocoa Bindingにも触れる「TigerのCocoaにみるMVCの完成 - スマートなデータモデルを実現するCore Data」(マイコミジャーナル・コラム)


* Foudation Frameworks [#h92ae663]
Foudation Frameworks は Carbon の完全なラッパーとなつて居る。幾つか憶えるべき最低限のものを擧げてみれば、それは NSString、NSArray、NSDictionary などのクラスである。まづ、基本的なクラスを紹介する。
Foudation Frameworks は Carbon の完全なラッパーとなって居る。幾つか憶えるべき最低限のものを挙げてみれば、それは NSString、NSArray、NSDictionary などのクラスである。まず、基本的なクラスを紹介する。

** NSObject・・・オブジェクトの生成 [#t4bf3fcd]
NSObject はルートクラスであり、次のプロトコルに "接續" する(Adopted Protocol)。
NSObject はルートクラスであり、次のプロトコルに "接続" する(Adopted Protocol)。

-NSObject Protocol
-NSKeyValueCoding Protocol
-NSKeyValueObserving Protocol

これらのプロトコルで實裝されるのはインスタンスメソッドのみとなる。Cocoa では次のステップを踏みインスタンスを生成する。
これらのプロトコルで実装されるのはインスタンスメソッドのみとなる。Cocoa では次のステップを踏みインスタンスを生成する。

 NSObject *obj = [NSObject alloc];
 [obj init];
 [obj autorelease];

*** インスタンス生成(甲): [#u089dc39]
>alloc はデザインパターンの Factory にあたり、Objective-C ではこのクラスメソッドがメモリ確保を行ふ。絶對に子クラスで上書きしてはならない。なほ alloc は NSObject に實裝されてゐる。これを「割り當て」と呼ぶ。他の言語のやうに new Class といふ記法はないが、new メソッドが存在する(後述)
>alloc はデザインパターンの Factory にあたり、Objective-C ではこのクラスメソッドがメモリ確保を行う。絶対に子クラスで上書きしてはならない。なお alloc は NSObject に実装されている。これを「割り当て」と呼ぶ。他の言語のように new Class という記法はないが、new メソッドが存在する(後述)

>後述の NSArray や NSString といつたクラスのクラスメソッドには次の物がある。
>後述の NSArray や NSString といったクラスのクラスメソッドには次の物がある。
 + array
 + arrayWithArray
 + string
 + stringWithCString:encoding:
 + allocWithZone
 + new
array*** とあるのは NSArray の Factory であり、string*** とあるのは NSString の Factory にあたる。Cocoa の Factory は戻り値として初期化する前のインスタンスを返す。なほ Objective-C では + を伴ふメソッド定義がクラスメソッドを示す。
array*** とあるのは NSArray の Factory であり、string*** とあるのは NSString の Factory にあたる。Cocoa の Factory は戻り値として初期化する前のインスタンスを返す。なお Objective-C では + を伴うメソッド定義がクラスメソッドを示す。

>割り當てられた領域は NSZone クラスのインスタンスとして(zone メソッドにより)取得することができ、allocWithZone で生成すれば同じ領域を使用できる。また、參照カウント及びインスタンス變數の初期化を行ふ。ここに於いて isa インスタンス變數の決定といふ重大な過程を經過する。
>割り当てられた領域は NSZone クラスのインスタンスとして(zone メソッドにより)取得することができ、allocWithZone で生成すれば同じ領域を使用できる。また、参照カウント及びインスタンス変数の初期化を行う。ここに於いて isa インスタンス変数の決定という重大な過程を経過する。

*** インスタンス生成(乙): [#mea3fe38]
>init は初期化メソッドであり、インスタンスメソッドである。子クラスで繼承できるが、親クラスのインスタンスメソッドを實行させること。NSObject に實裝。
>init は初期化メソッドであり、インスタンスメソッドである。子クラスで継承できるが、親クラスのインスタンスメソッドを実行させること。NSObject に実装。
 - (id)initWithArray:(NSArray *)array
 - (id)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:(NSDate *)anotherDate
 - (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag
 - (id)initWithFrame:(NSRect)frameRect
これも同樣に init*** といふ命名規則を持つ。これは NSSet、NSDate、以降はAppKit だが NSWindow、NSControl(及びNSView) などのメソッドである。
これも同様に init*** という命名規則を持つ。これは NSSet、NSDate、以降はAppKit だが NSWindow、NSControl(及びNSView) などのメソッドである。

>似たやうなメソッドとしてinitializeがあるが、こちらは「クラス」の初期化を擔ふ。一度しか呼ばれない(後述)。なほ初期化した自身を返すのだが、 id 型を返すとあるのはこれを不特定の何か程度に認識して於いてほしい。C の爲に存在し、Objective-C では id 型がオブジェクトを指す。
>似たようなメソッドとしてinitializeがあるが、こちらは「クラス」の初期化を担う。一度しか呼ばれない(後述)。なお初期化した自身を返すのだが、 id 型を返すとあるのはこれを不特定の何か程度に認識して於いてほしい。C の為に存在し、Objective-C では id 型がオブジェクトを指す。

*** インスタンス生成(丙): [#xdaf275e]
>autorelease は自動で release する、すなはちメモリ解放の爲の手續きである。最近の言語では garbage collection は最早定番とも言へるがこれも似た手段である。解放プールに入れると表現されるが、それはアプリケーション起動時に NSApplication が NSAutoreleasePool クラスのインスタンスを作り、これに叩き込んで監視するからである。
>autorelease は自動で release する、すなわちメモリ解放の為の手続きである。最近の言語では garbage collection は最早定番とも言えるがこれも似た手段である。解放プールに入れると表現されるが、それはアプリケーション起動時に NSApplication が NSAutoreleasePool クラスのインスタンスを作り、これに叩き込んで監視するからである。
 - autorelease
 - release
 - retain
 - retainCount
NSObject Protocol によつてこれらのインスタンスメソッドが定義される。autorelease は明示的に release をするのと變はらぬ效果を與へる。retain は參照カウンタを増大させ release は參照カウンタを減少させるものだが、NSArray といつたコレクションクラスに插入すると自動的に retain が呼ばれ參照カウンタが増える仕組みになつて居る。不要になれば release か autorelease を呼ばねばならない。
NSObject Protocol によってこれらのインスタンスメソッドが定義される。autorelease は明示的に release をするのと変わらぬ効果を与える。retain は参照カウンタを増大させ release は参照カウンタを減少させるものだが、NSArray といったコレクションクラスに挿入すると自動的に retain が呼ばれ参照カウンタが増える仕組みになって居る。不要になれば release か autorelease を呼ばねばならない。

>正確な意味での garbage collection は Objective-C 2.0 への擴張で組み込まれ Leopard より實裝された。保守的(conservative)な GC である。
>正確な意味での garbage collection は Objective-C 2.0 への拡張で組み込まれ Leopard より実装された。保守的(conservative)な GC である。

*** インスタンス生成(丁): [#e7e3e500]
>他にインスタンス生成に於いて俯瞰せしめた際に見渡せることを書連ねる。Cocoa では isa インスタンス變數を組み込むことでクラスを識別する。かういつたクラスに關する處理で特殊なものがあるから紹介する。
>他にインスタンス生成に於いて俯瞰せしめた際に見渡せることを書連ねる。Cocoa では isa インスタンス変数を組み込むことでクラスを識別する。こういったクラスに関する処理で特殊なものがあるから紹介する。
 ### NSObject: Adopted Protocol
 ## NSObject Protocol
 #	Identifying and Comparing Objects
 - isEqual
 - hash
 - self
 #	Describing Objects
 - description
 #	Sending Messages
 - performSelector
 #	Determining Allocation Zones
 - zone
 #	Identifying Proxies
 - isProxy
 
 ### NSObject Class: Tasks
 #	Initializing a Class
 + initialize
 + load
 #	Creating, Copying, and Deallocating Objects
 + new
 - dealloc
 - finalize
 
 ### NSString Class: Tasks
 - hash
 - isEqualToString
あるプロセスに於いて NSMutableString クラス(NSMutableString > NSString > NSObject)が始めて呼びだされたとして、その時に NSMutableString のクラスメソッドたる initialize が自動的に呼び出される。親クラスたる NSString クラスの initialize が呼び出されてゐない場合も同樣である。また、load クラスメソッドもクラスがプログラムに讀み込まれたことを告げるために initialize を呼ぶ前に呼び出される。すなはち次の順となる。
あるプロセスに於いて NSMutableString クラス(NSMutableString > NSString > NSObject)が初めて呼びだされたとして、その時に NSMutableString のクラスメソッドたる initialize が自動的に呼び出される。親クラスたる NSString クラスの initialize が呼び出されていない場合も同様である。また、load クラスメソッドもクラスがプログラムに読み込まれたことを告げるために initialize を呼ぶ前に呼び出される。すなわち次の順となる。
 [NSObject load];
 [NSObject initialize];
 [NSString load];
 [NSString initialize];
 [NSMutableString load];
 [NSMutableString initialize];
new クラスメソッドは次の式と等價である
new クラスメソッドは次の式と等価である
 [NSObject new];
 
 # Pattern1
 NSObject *obj = [[NSObject alloc] init];
 
 # Pattern2
 NSObject *obj = [[NSObject alloc] init];
ただし、new に渡された引數は init にも渡されることになり、alloc と異なり子クラスで上書きしても構はない。
ただし、new に渡された引数は init にも渡されることになり、alloc と異なり子クラスで上書きしても構わない。

>dealloc はメモリ解放を行ひ、release により呼び出される。明示的に dealloc を呼ぶ事は無い。獨自のメモリ解放機構を備へるなど子クラスで再定義できる。
>dealloc はメモリ解放を行い、release により呼び出される。明示的に dealloc を呼ぶ事は無い。独自のメモリ解放機構を備えるなど子クラスで再定義できる。

>finalize は dealloc に代はり呼び出される。GC が有效なとき、autorelease を呼んだときなど(よくわからんから調査中)。
>finalize は dealloc に代わり呼び出される。GC が有効なとき、autorelease を呼んだときなど(よくわからんから調査中)。

>description 則ち「説明」とあるけど、これは NSString にインスタンスを變換しこれを返す。所謂「toString」「to_s」 などのメソッドと考へて欲しい。isEqual は何が「イコールか?」と云ふとインスタンスの hash メソッドを用ゐて比較した眞僞値を返す。たとへば、NSString クラスでは hash メソッドが再定義され、同時に isEqualToString が追加された。isEqualToArray、isEqualToDate、isEqualToSet など似たメソッドは澤山ある。self はインスタンス自身を返すメソッド。
>description 則ち「説明」とあるけど、これは NSString にインスタンスを変換しこれを返す。いわゆる「toString」「to_s」 などのメソッドと考えて欲しい。isEqual は何が「イコールか?」と云うとインスタンスの hash メソッドを用いて比較した真偽値を返す。たとえば、NSString クラスでは hash メソッドが再定義され、同時に isEqualToString が追加された。isEqualToArray、isEqualToDate、isEqualToSet など似たメソッドはたくさんある。self はインスタンス自身を返すメソッド。

>zone は先述の NSZone を作つて返すメソッド。これは allocWithZone、copyWithZone といつたやうなクラスメソッドなどの引數となる。
>zone は先述の NSZone を作って返すメソッド。これは allocWithZone、copyWithZone といったようなクラスメソッドなどの引数となる。

>performSelector は SEL、IMP、Methodの三つの型を理解する爲に擧げた。一部の例が Ruby で申し訣ないが、次のやうな物である
-SEL型:セレクタ。C の構造體のポインタ型(Opaque、實態はchar型)。Ruby だと Symbol クラス。
-IMP型:メソッドの實裝。C の函數ポインタ。Ruby だと Proc クラスなどか。
-Method型:メソッド。C の構造體で、SEL型・IMP型・char型を格納する。
>performSelector は SEL、IMP、Methodの三つの型を理解する為に挙げた。一部の例が Ruby で申し訳ないが、次のような物である
-SEL型:セレクタ。C の構造体のポインタ型(Opaque、実態はchar型)。Ruby だと Symbol クラス。
-IMP型:メソッドの実装。C の関数ポインタ。Ruby だと Proc クラスなどか。
-Method型:メソッド。C の構造体で、SEL型・IMP型・char型を格納する。

>
 ### objc-class.h
 typedef struct objc_method *Method;
 struct objc_method {
     SEL method_name;
     char *method_types;
     IMP method_imp;
 };
 ### objc.h
 typedef struct objc_selector *SEL;
 typedef id (*IMP)(id, SEL, ...);
 
 ### performSelector は次のやうに使ふ(self メソッドを呼ぶ)
 ### performSelector は次のように使う(self メソッドを呼ぶ)
 SEL *aSelector = @selector(:self); # @selector は ObjC の言語構造である
 				# なほこれらの@で始まるこれらの文字をコンパイラへの「ディレクティブ」と呼び、他にも幾つかある。
 SEL *aSelector = NSSelectorFromString(@"self"); # この定義濟函數でNSString から SEL に變換できる。
 				# 同樣に@"string" はディレクティブであり、呼出したモヂュール内部での NSString のオブジェクト定數となる。
 				# なおこれらの@で始まるこれらの文字をコンパイラへの「ディレクティブ」と呼び、他にも幾つかある。
 SEL *aSelector = NSSelectorFromString(@"self"); # この定義済関数でNSString から SEL に変換できる。
 				# 同様に@"string" はディレクティブであり、呼出したモヂュール内部での NSString のオブジェクト定数となる。
 [obj performSelector: aSelector]; # 送信先からの戻り値を返す。id 型なので何でもアリ。
 
 NSString *method = NSStringFromSelector(aSelector); # この定義濟函數で SEL から NSString に變換できる
isProxy が NSObject Protocol に態〻定義されてゐるのは、NSProxy クラスがルートクラスだからである。NSProxy は NSObject Protocol を實裝するけれども、他のクラスと異なり NSObject を繼承しない。クラスとプロトコルの違ひを強調する爲に項を割いた。
 NSString *method = NSStringFromSelector(aSelector); # この定義済関数で SEL から NSString に変換できる
isProxy が NSObject Protocol にわざわざ定義されているのは、NSProxy クラスがルートクラスだからである。NSProxy は NSObject Protocol を実装するけれども、他のクラスと異なり NSObject を継承しない。クラスとプロトコルの違いを強調する為に項を割いた。

*** confer.參照セヨ [#t3d00281]
*** confer.参照セヨ [#t3d00281]
-http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/
--Class References(NSObject, NSString, NSDate, NSMutableString, NSArray, NSSet)
--Protocol References(NSObject, NSKeyValueCoding, NSKeyValueObserving)
--Other References(Functions, Data Types)
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_6.html
~Cocoa基礎ガイド > Cocoaオブジェクト > オブジェクトの作成
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/Articles/chapter_13_section_3.html
~Objective-C 2.0プログラミング言語 >ランタイムシステム > オブジェクトの割り当てと初期化
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_4.html
~Objective-C 2.0プログラミング言語 > クラス
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_6.html
~Objective-C 2.0プログラミング言語 > メッセージングの仕組み
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/5objc_language_summary/chapter_10_section_5.html
~Objective-C 2.0プログラミング言語 > 付録 A: 言語の要約 > コンパイラのディレクティブ
-http://journal.mycom.co.jp/column/objc/
~マイコミの「ダイナミックObjective-C」コラム。オブジェクトについては14~17あたりをみてほしい。メソッドについては18~22。GC については96~100。
-http://wwwa.dcns.ne.jp/~nito/CocoaClub/
~Cocoaプログラミングの話題。Cocoaのメモリ管理など參照。
~Cocoaプログラミングの話題。Cocoaのメモリ管理など参照。
-http://www.nslabs.jp/objc.rhtml
~かんたんObjective-C
-http://homepage.mac.com/mkino2/spec/optimize/foundation.html
~Foundation クラスの最適化

** Foundation Collections Types [#u9d70944]
Cocoa では次のコレクションが用意される。繼承關係も示した
Cocoa では次のコレクションが用意される。継承関係も示した
-NSArray > NSObject
-NSDictionary > NSObject
-NSSet > NSObject

NSArray は配列、NSDictionary は辭書(ハッシュ)、NSSet は集合(聚合、重複を許さぬ配列)です。このクラスに格納したオブジェクトは變更することができない(Immutable)。變更すること(Mutable)を望む場合は次のクラスを使用する。
NSArray は配列、NSDictionary は辞書(ハッシュ)、NSSet は集合(集合、重複を許さぬ配列)です。このクラスに格納したオブジェクトは変更することができない(Immutable)。変更すること(Mutable)を望む場合は次のクラスを使用する。

-NSMutableArray > NSArray > NSObject
-NSMutableDictionary > NSDictionary > NSObject
-NSMutableSet > NSSet > NSObject

またコレクションは次のプロトコルを實裝する。
またコレクションは次のプロトコルを実装する。
-NSCoding Protocol
-NSCopying Protocol
-NSMutableCopying Protocol
-NSFastEnumeration Protocol

NSFastEnumeration は Objective-C 2.0 より實裝された高速列擧(Leopard 以降)のためのもので次の表記が可能になる。
NSFastEnumeration は Objective-C 2.0 より実装された高速列挙(Leopard 以降)のためのもので次の表記が可能になる。
 for(id objectItem in array){
 ....
 }
NSCopying、NSMutableCopying は複製するためのプロトコル。NSObject に複製用メソッドは定義されてゐるものの、NSObject はこのプロトコルに關しては實裝してゐない。
NSCopying、NSMutableCopying は複製するためのプロトコル。NSObject に複製用メソッドは定義されているものの、NSObject はこのプロトコルに関しては実装していない。
 ### NSObject Class: Tasks
 - copy
 + copyWithZone
 - mutableCopy
 + mutableCopyWithZone
 
 ### NSArray, NSDictionary, NSSet: Adopted Protocol
 ## NSCopying Protocol
 - copyWithZone
 ## NSMutableCopying Protocol
 - mutableCopyWithZone

*** confer.參照セヨ [#d36dfc6c]
*** confer.参照セヨ [#d36dfc6c]
-http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/
--Class References(NSArray, NSDictionary, NSSet, NSMutableArray, NSMutableDictionary, NSMutableSet)
--Protocol References(NSCoding, NSCopying, NSMutableCopying, NSFastEnumeration)
--Other References(Functions, Data Types)
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/Articles/chapter_7_section_1.html
~Objective-C 2.0プログラミング言語 > 高速列挙

** Foundation Primitive / Numerical Types [#jba29b34]
一方で次のやうなデータ型的な物がある。Primitive とあるやうに基本である Foundation の更に基本構成員たちである。
一方で次のようなデータ型的な物がある。Primitive とあるように基本である Foundation の更に基本構成員たちである。
-NSString
-NSData
-NSDate
-NSValue
-NSNumber
-NSIndexSet
-NSNull

*** confer.參照セヨ [#m061392d]
*** confer.参照セヨ [#m061392d]
-http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/
--Class References(NSString, NSData, NSDate, NSValue, NSNumber, NSIndexSet, NSNull)
--Protocol References(NSCoding, NSCopying, NSMutableCopying)

** Foundation Data Types [#vfcbfed8]
更に次のやうな型が定義される。これは C の構造體といふ位置づけになる。
更に次のような型が定義される。これは C の構造体という位置づけになる。
-NSPoint
-NSSize
-NSRect
-NSRange

NSRange は特に Foundation に於いて頻出である。これら構造體は CGFloat、NSUInteger などの型を格納する。そんなにややこしいものでもないので「Foundation Data Types Reference」及びヘッダファイルより拔萃。
NSRange は特に Foundation に於いて頻出である。これら構造体は CGFloat、NSUInteger などの型を格納する。そんなにややこしいものでもないので「Foundation Data Types Reference」及びヘッダファイルより抜粋。
 typedef struct _NSPoint {
    CGFloat x;
    CGFloat y;
 } NSPoint;
 typedef struct _NSRect {
    NSPoint origin;
    NSSize size;
 } NSRect;
 typedef struct _NSSize {
    CGFloat width;
    CGFloat height;
 } NSSize;
 typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
 } NSRange;
 
 #if __LP64__
 typedef long NSInteger;
 typedef unsigned long NSUInteger;
 #else
 typedef int NSInteger;
 typedef unsigned int NSUInteger;
 endif

NSUInteger は 64bit な Mac と 32bit な Mac に於いての工夫を施すために定義された型となる(註:つまりvoid *、ポインタと同じ大きさ)。
NSUInteger は 64bit な Mac と 32bit な Mac に於いての工夫を施すために定義された型となる(注:つまりvoid *、ポインタと同じ大きさ)。

 //CGBase.h
 typedef float CGFloat;// 32-bit
 typedef double CGFloat;// 64-bit

CGFloat 型は「CGGeometry Reference(CGBase.h)」に説明があるけれども、要するにfloat(double)型である。これらを列擧した理由は NSValue がサポートする物だからに他ならない。NSValue がサポートできる型の値は KVC の自動ラッピング機構を利用できる。
CGFloat 型は「CGGeometry Reference(CGBase.h)」に説明があるけれども、要するにfloat(double)型である。これらを列挙した理由は NSValue がサポートする物だからに他ならない。NSValue がサポートできる型の値は KVC の自動ラッピング機構を利用できる。

また次の定義濟函數で各々の型を作ることができる。
また次の定義済関数で各々の型を作ることができる。
 NSMakePoint(x, y)
 NSMakeRect(origin,size)
 NSMakeSize(width, height)
 NSMakeRange(location, length)

*** confer.參照セヨ [#p91debd2]
*** confer.参照セヨ [#p91debd2]
-http://developer.apple.com/documentation/Cocoa/Reference/Foundation/ObjC_classic/
--Class References(NSValue)
--Protocol References(NSKeyValueCoding)
--Other References(Functions, Data Types)


* 参考[#w67ee630]
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/
~本家本元のAppleによる 「Objective-C プログラミング言語」の解説。
-http://journal.mycom.co.jp/column/objc/
~ダイナミックObjective-C(マイコミジャーナル・コラム)。Cocoa での Objective-C がいかに動的な工夫があるか、いかにデザインパターンを實裝するかを綴る。
~ダイナミックObjective-C(マイコミジャーナル・コラム)。Cocoa での Objective-C がいかに動的な工夫があるか、いかにデザインパターンを実装するかを綴る。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS