完全なC互換。CocoaはObjective-CのAPI。Cocoaについて学べば必然的にObjective-Cについて学べます。主な開発環境はXcode(または旧Project Builder)。[[プログラミング言語]]
* 目次 [#z9920e6c]
#contents
*新版(構成豫定圖) [#v6dbd455]
#author("2023-11-12T02:31:09+09:00;2023-02-23T23:33:34+09:00","default:vip","vip")
*Objective-C [#m05c3047]
一般的な Object 指向の思想を理解してゐる前提の元に文法事項を解説。全てを粒さに讀む必要はない。Cocoa の方をやりながら文法事項を知りたいなと感じれば、外國語の學習同樣に、必要な時に必要な所を參照した方がよい。
完全なC互換。CocoaはObjective-CのAPI。~
Cocoaについて学べば必然的にObjective-Cについて学べます。~
主な開発環境はXcode(または旧Project Builder)。

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

-id
一般的な Object 指向の思想を理解している前提の元に文法事項を解説。全てをつぶさに読む必要はなく、必要な時に必要な所を参照した方がよい。

**予め定義された型と変数 [#predefined]
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ファイルが自然に追加される。
**クラス(class) [#class]
定義は.hファイル、実装は.mファイルに書く。Xcode だと自然に追加される。

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

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

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

註:新たにクラスを定義する場合は、一般に NSObject を繼承したクラスを定義する。その理由は NSObject が Cocoa における一般的な手續きを全て網羅してゐるからである。またその他のクラスに於ては、特段の理由や意味がない限り、サブクラスを造らない方が良い(譬へば NSString や NSArray のサブクラスを作製しても思ふ樣にはいかないだらう)。逆に能くサブクラスを作るのは、NSObject の他に、稀だが NSApplication の場合や、或いはサブクラスを作る爲のクラス NSManagedObject 等である。
*** 命名規約(クラス) [#classname]
クラスは大文字で始める。自身のクラスに接頭辞を付ける際、
NS(NeXTSTEP)や IO(Input-Output)や OS(Operating System) や CG(Core Graphics)はAppleによって既に使われていて紛らわしいので避けよう。

***よくサブクラスを作るスーパークラスの例 [#zef6ef3a]
-NSObject
-NSView
-NSCell
-NSWindowController
-NSViewController
-NSManagedObject
**メッセージ(message)/メソッド(method) [#method]
先程のクラスに、インスタンス変数 obj、クラスメソッド myClassMethod、メソッド myMethod を追加すると、

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

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

**メッセージ(message)或いはメソッド(method) [#d7cd9816]
今先程のクラスに、インスタンス變數 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(#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){@interface}; ~ &color(#CB0094){@end}; と &color(#CB0094){@implementation}; ~ &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 のコードとは共存できる)。
MyObject のインスタンスを保持した変数 receiver が存在したとして、二つのメソッドを呼び出すには、

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

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

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

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

***引數 [#j0bd7053]
引數を渡すには幾つか規則が存るが、先づ單純な一つ渡す方法を示す。今 id 型の變數 value を -myMethod に渡すとして、
***引数 [#args]
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){id};)myMethod'':(&color(#CB0094){id};)val;''~
&color(#CB0094){@end};~
&color(#007900){// MyObject.m};~

>&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){id};)myMethod'':(&color(#CB0094){id};)val;''~
{~
   &color(#CB0094){return}; obj;~
}~
&color(#CB0094){@end};

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

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

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

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

と書ける。

***ラベル(label) [#c741a9fc]
Objective-C で尤も一般的な複數引數の記述・利用法がラベルである。Objective-C では、その他の言語での引數がただの變數の羅列になるのとは對蹠的に、引數に名前を指定する。この名前をラベルと謂ふ。座標を渡すメソッドを考へたならば、
***ラベル(label) [#label]
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;~
-(&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 では上にある樣に見目に分り易くなつてゐる。詰り打鍵數は増えるかもしれないが、それでもなほ利點が大きいと判斷された爲に、ラベルは導入されたのである。
と書く。C の関数等で myMethod(val,num1,num2); と書くと引数の意味が取りづらいが、
Objective-C では上にある様に見た目に分かり易くなっている。

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

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

***メソッドの上書き(override) [#b0bf19fb]
Objective-C は柔軟すぎる言語である。中にはかなり邪惡或いは病的な手段も存在するが、それらの使用は全てプログラマ委(まか)せとなつてゐる。これは Objective-C が弱い型附けである事と同じ理由であらう。今は親クラス(superclass)のメソッドを上書き(override)する方法を示す。
***命名規約(メソッド) [#methodname]
Cocoa API を見て行くと以下のような暗默の了解がある。一貫性は大事なので従っておこう。

<準備中>
NSString のメソッドを例にすると、

註:上書きする場合はいちいちヘッダに書く必要は無いが、若し書きたいと思ふのなら、書いても問題はない。
+ 初期化
+++ stringWithString:, + stringWithUTF8String:, etc.~
特別なファクトリメソッド(簡易コンストラクタと言う)。戻り値は初期化されている。
++- initWithString:, - initWithUTF8String:, etc.~
特別なイニシャライザ(指定イニシャライザと言う)。init で始める。初期化については後述。
+- writeToFile:atomically:encoding:error:, - writeToURL:atomically:encoding:error:~
writeTo はデータを書き出すメソッド名である。データは NSData にするのが一般的。
+- isAbsolutePath~
真偽値を返す場合に is で書き始める。
+- UTF8String, - length, - propertyList, etc.~
Objective-C における getter は get を付けない。一方 setter は set で書き始めても構わない。詳しくは Key-Value Coding Protocol を参照。
+- getLineStart:end:contentsEnd:forRange:, - getCString:maxLength:encoding:~
get は getter ではなく、C のポインタを渡してインスタンスから値を取得する場合に用いる(つまり参照渡しの)メソッドである。

***命名規約(メソッド) [#q882018d]
Cocoa API を見て行くと暗默上の諒解が幾つもある。この事はもう少し後に扱ふべき内容であるから、API をみて何かあると感じた時、規約がある事を思ひ出して欲しい。
**レシーバ(receiver)/インスタンス(instance) [#receiver]
Objective-C のインスタンスは C のポインタなので、変数の型に * が必要。

今 NSString のメソッドを例にすると、
>&color(#641D9E){NSObject}; *obj = [[&color(#641D9E){NSObject}; &color(#370071){alloc};] &color(#370071){init};];

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

等が即座に指摘できる。これらは順にドキュメントを讀んだりしながら、各が會得して欲しい事項である。
alloc と init は NSObject で定義されており、Objective-C の根幹を成すメソッドの一つである。
alloc がレシーバにメモリを割り当て、init がこれを初期化する。

**レシーバ(receiver)或いはインスタンス(instance) [#x20a75d7]
Objective-C におけるインスタンスは、C のポインタである。だから變數の型にはポインタを表す * が必須である。
註:+new は、+alloc と -init を呼び出すのと同等。

>&color(#641D9E){NSObject}; *obj = [[&color(#641D9E){NSObject}; &color(#370071){alloc};] &color(#370071){init};];
***nil の扱い[#nilreceiver]
nil に存在しないメッセージを送信しても、余計なエラーが発生しない。

このインスタンスたるポインタに、Objective-C の Runtime が、メッセージを送受信してオブジェクト指向たらしめてゐる。なんとなれば、id 型は void * 型と等價であると謂ふ事だが、一つだけ違ふ點は、id 型が Objective-C のレシーバであると保證してくれる事である。だから任意のクラスのレシーバを利用したい場合は id 型を用ゐるとよい。
>[&color(#CB0094){nil}; &color(#13484C){myMethod};];&color(#007900){// エラーにならない};~
[receiver &color(#13484C){myMethod2};]; &color(#007900){// myMethod2が未定義ならばエラー};

***レシーバの初期化 [#jdb8da1d]
レシーバの初期化は上にあげた +alloc, -init が尤も基本的な物であるが、ファクトリメソッドが用意されることもある。遣ひ分けは後々メモリ管理で論じるが、今はメモリリークは一切氣にせずに、初期化法を考へてみる。
**メモリ管理 [#gc]
Objective-C のメモリ管理は「参照カウント」と「ガベージコレクション」が用意される。ここでは参照カウントにまつわるメソッド、つまり NSObject に実装されている NSObject Protocol の +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説する。なおガベージコレクションを利用する場合は Mac OS 10.5 以降に導入されたため以前のバージョンと互換性がない事に注意。

alloc と init は NSObject(より正確には NSObject Protocol)で定義されてをり、Objective-C の根幹を成すメソッドの一つである。alloc はレシーバにメモリを割り當てるが、この alloc は上書きしてはならない。init はこれを初期化するが、自身の初期化をコードを用ゐたいならば、上書きしてもよい。
+alloc はメモリを割り当てたオブジェクトを返す。malloc 同様確保に失敗すれば nil を返す。生成されるオブジェクトの参照カウント は 1 となる。
+init はオブジェクトを初期化する。Cocoa はこの二段構えにする事でオブジェクト生成に柔軟性を与えている。
+retain はメモリ割り当てを解放しない為の手続きである。参照カウントを 1 増やす。
+release はメモリ割り当てを解放する為の手続きである。参照カウントを 1 減らす。

註:オブジェクトの所有權についてはメモリ管理をみて欲しい。より詳しい初期化についての事はそこで述べることになる。
一般に上から順に実行する。任意の瞬間にオブジェクトを解放するならば、retain によりカウンタを増し release によりカウンタを減らせばよい。release は参照カウントが 0 になればオブジェクトを解放してくれる。

***nil の扱ひ[#p1df9b13]
Objective-C では、nil に存在しないメッセージを送信しても、エラーが發生しない。これは通常のレシーバでは致命的なエラーとなる事と異なる結果を導くので注意して欲しい。
註:-retainCount によりカウンタを取得できる。NSLog(@"%d", [receiver retainCount]); と呼び出して、カウンタの動作を確認して欲しい。

>[&color(#CB0094){nil}; &color(#13484C){myMethod};];&color(#007900){// エラーにならない};~
[receiver &color(#13484C){myMethod2};]; &color(#007900){// myMethod2が未定義ならばエラー};
註:ガベージコレクションでは、nil を代入する事が、解放の目安となる。従って不要な変数には nil を代入すること。

これは譬へば delegate で nil を設定しても呼出しに惱む必要がない等、ただメッセージを送信するだけの用途のコードのエラー處理を短縮する事になるだらう。
註:iOS ではメモリが限られているためガベージコレクションが利用できない。

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

+alloc はメモリを割り當てたオブジェクトを返す。malloc 同樣確保に失敗すれば nil を返す。生成されるオブジェクトの參照カウント は 1 となる。
+init はオブジェクトを初期化する。Cocoa はこの二段構へにする事でオブジェクト生成に柔軟性を與へてゐる。
+retain はメモリ割り當てを解放しない爲の手續きである。參照カウントを 1 増やす。
+release はメモリ割り當てを解放する爲の手續きである。參照カウントを 1 減らす。
インスタンスの初期化は -init 等の指定イニシャライザで行う。

一般に上から順に實行する。Objective-C Runtime は、メソッドを實行し終はると、alloc で 生成したオブジェクトにメモリ解放するメッセージ [receiver release]; を自動的に送る。だから任意の瞬間にオブジェクトを解放したいのならば、retain によりカウンタを増し release によりカウンタを減らせばよい。release は參照カウントが 0 になればオブジェクトを解放してくれる。
メモリ解放時の処理は -dealloc, -finalize で行う。-dealloc は参照カウンタにおける解放、-finalize はガベージコレクタにおける解放で自動的に呼び出される。
ただし、必ず呼び出されると期待しない方がよく、アプリケーションの終了時に必要な処理を記述する事は避けた方がよい
(例えば、NSApplication に -terminate とすると、OS が強制的にメモリを回収するらしく、-dealloc を呼ぶ事がない)。

註:-dealloc は強制的にメモリを解放する手段ともなる。

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

>−(&color(#CB0094){id};)myMethod~
>-(&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 してみればどうなるであらうか・・・・。
このメソッドの戻り値を利用する場合、戻り値を取得した時点でカウンタは 1 となり、-release しなければ解放が起こらずリークする。~
この場合、autorelease を呼び、Autorelease pool に追加することで問題を解決できる。

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

こうすると、Autorelease pool 上にあって且つカウンタが 1 となったインスタンスを取得できる。

註:以上の事から、指定イニシャライザで取得したインスタンスの場合は、代入的手段を直接行ってはならないとわかる。どうしてもその必要のある場合は、NSLog([[[[NSObject alloc] init] autorelease] description]); と、-autorelease の戻り値を利用する事で解決できる。

註:通常の開発では、NSApplication が NSAutoreleasePool のインスタンスを生成しているから、autorelease はこのままで動作する。
しかし Cocoa Application 以外の Cocoa を利用した開発では、自前の Autorelease pool を用意する必要がある。
また、任意に -drain を呼んでやる必要がでてくる。この -drain は pool のインスタンスに -release を送信する。

>NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];~
/* code */~
[pool drain];~

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

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

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

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

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

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

+NSSize
--NSView 及びそのサブクラスでよく使うことになる。NSMakeSize。
+NSPoint
+NSRect
+NSRange
--配列なんかで用いる。NSMakeRange で生成できる。

*附録:Objective-C [#v8ad2bf8]
**ディレクティブ(directive) [#z984e5a5]
Objective-C におけるコンパイラ及びプリプロセッサへの命令について。C 標準は勿論のこと、幾らかの擴張がある。それが以下である。
Objective-C におけるコンパイラ及びプリプロセッサへの命令について。C 標準は勿論のこと、いくらかの拡張がある。それが以下である。
***コンパイラのディレクティブ [#j3225b9a]
-#import
-//

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

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

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

-@private
-@protected
-@protected (初期設定)
-@public

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

-@try
-@throw
-@catch()
-@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" を同メソッド内で何度呼びだしても、同じインスタンスを返してくれる。
***その他のディレクティブ [#ad539716]
言語仕樣に明るいわけではないが、譬へば 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 らしい物は當然互換性の障碍となるから注意である。
***ビルド構成 [#zbbd002c]
恐らく debug になつてゐるので、「出荷」するときは release にするやうに。ビルド構成は、ビルド時に指定するコンパイラオプション等を保存した物で、任意に切替ることができる。
***ターゲット(target) [#f63780de]
作る實行ファイルのこと。ビルド前は存在しないから赤い文字で表記される。
***リンカ(linker) [#r87355c5]
***ヘッダファイル [#k4c8ea24]
***デバッガ(debugger) [#oc7dc096]
<デバッガの遣ひ方とか mark の仕方を書きたいのだけれど?>
***pch ファイルとプリコンパイル [#lfe69b50]
Cocoa Application では precompile と呼ばれる工程がある。pch ファイルは、C++ でもお馴染みかもしれないが、Precompiled Header の事である。precompile とは文字通り compile の前段階のことで、簡單に謂ふと、キャッシュを用意する事で Cocoa Application のビルド時間が短縮できる。Xcode でこれを編輯することは先づないので、飾り程度に認識しておくとよい。
一応説明が必要なのは @"string" であろう。@"string" は quoted な部位を NSString class のレシーバとして処理する構造である。@"abc" と書けば、abc なる文字を保持した NSString class のインスタンスが const として生成される。しかも(同じ stack であればだと記憶するが)@"string" を同メソッド内で何度呼びだしても、同じインスタンスを返してくれる。

ただこのキャッシュは 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]
註:インスタンス変数の可視性は、コンパイラが警告を出す申しわけ程度の物である。
どのみちカテゴリを用いればどんな変数であれ参照・変更が可能なのであり、可視性は無力化できてしまう。

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

***実行環境のはなし: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]; と同等である。
なお、メソッドを上書きしていなければ、self とは別のインスタンス等でも関数ポインタは同一である。NSLog(@"%p", method->method_imp); として確かめてみればよい。

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

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

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

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

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

 //   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]
***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 と呼ばれる。
***First Responder [#sace8878]
標準でかなり多くのアクションが Main menu から設定されているが、これら全ては最終的に他のオブジェクトへの呼び出しとなる。その仕組みは responder chain と呼ばれる。
**バインディング(Binding) [#d75a1c73]
10.3 あたりから導入された憶えがある。面倒なので解説丸投げ。

-[[Cocoa Binding : バインディングって何なのさ:http://sitearo.com/cocoa/1100_binding/01_whats/]]

**通知(Notification) [#w12f5991]
**Foundation Framework [#i8aa10b0]
文字通り基礎的な API。主要なデータ型のクラスが定義されてたり、その他 Cocoa の拡張にあわせて機能が追加されたり。

**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 については割愛する。
**はじめての 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() 參照。
***NSArray, NSMutableArray [#yba263f2]
***NSDictionary, NSMutableDictionary [#pa343d08]
***NSIndexSet, NSMutableIndexSet [#n8ef5e68]
***NSNotification, NSNotificationCenter [#ebf4eb56]
**Application Kit Framework API [#dd49e84f]
***NSButton [#fc28156d]
***NSTableView, NSArrayController [#ne46d156]
dataSource と delegate をうまく遣ひこなすこと。
***NSOutlineView, NSTreeController [#qc8de67c]
NSTableView 同樣。
***NSView, NSViewController [#jbd5b15c]
カスタムビューに何か御用ですか?
***NSWindow, NSWindowController [#se2ff5b9]
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];
-[[NSObject Protocol Reference:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/]]

**參考等 [#s7e8ffef]
*Apple Developer [#k4f0a384]
**Xcode の Install と Download [#w411ca75]
**SDKs [#be042210]
**分散コンパイル [#lcac35b1]
**Document [#o447cf70]
**Open Source [#n217db5f]
***NSKeyValueCoding Protocol と NSKeyValueObserving Protocol [#da4d02be]
Protocol と呼ばれてはいるが、どちらかというと、文法として組み込まれていると考えてよい。setter、getter による binding と監視を実現する。

*舊版 [#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
-[[NSKeyValueCoding Protocol Reference:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/]]
-[[NSKeyValueObserving Protocol:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueObserving_Protocol/]]
***NSFastEnumeration Protocol [#b8b87c43]
10.5 以降で追加。高速列挙できる。コンパイル時に Obj-C から C 的な表現に置き換わるので、やや早い。

*Cocoa とは何か [#c95819d5]
Cocoa とは、Foudation Frameworks、CoreData Frameworks、AppKit Frameworks により構成される Objective-C の API 群である。
-[[NSFastEnumeration Protocol Reference:http://developer.apple.com/library/mac/#documentation/cocoa/reference/NSFastEnumeration_protocol/]]
***NSCoding Protocol [#o16d5326]
NSDocument Class を使ったアプリケーションで書類を保存する時なんかに大活躍。NSKeyedArchiver, NSKeyedUnarchiver Class とあわせて使う。

** Foudation とは [#t2196b7a]
Foudation は、そのまま「基層」の意である。化粧をする貴方には下地(ファンデ)でおなじみ。Cocoa で尤も酷使される可哀想なやつ。一方で、これの扱ひになれれば Cocoa API はグつとわかりやすいものになる。
-[[NSCoding Protocol Reference:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/]]
***NSCopying Protocol と NSMutableCopying Protocol [#h1b3bb41]
インスタンスをコピーするための手続き。shallow か deep かは実装まかせ。

抽象的で申し訣ないが、要するには Cocoa の頻出データ型を定め頻出する機能を纏めたやつである。MVC でいへば Model の提供が主で Controller の技術的補助(オブザーバなど)、View に渡すデータなどの役割を擔ふ健氣なやつ。
-[[NSCopying Protocol:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/]]
-[[NSMutableCopying Protocol:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSMutableCopying_Protocol/]]
**ローカライズ(Localization) [#k00f48e1]
Mac OS X の Install DVD は世界共通であると云うと、些かの驚きを持たれるかもしれない。これはそれを実現する方法論である。実際、システム環境設定を変更し再起動すれば、直ぐにでも、表記が English や Français に切り替わる。

** AppKit とは [#e8646e9f]
AppKit は、ApplicationKit の略である。Kit の接尾辭は Apple では擴張的であれど基本的な API 群につけるらしく、たとへば Safari の KHTML エンジンは WebKit Frameworks で實裝される。Cocoa にラップされた QuickTime API は QTKit である。
長くなるので丸投げ。その内、NSBundle Class の仕組みと strings の使い方ぐらいは書く。

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

さあ簡單に説明しよう。これが Cocoa AppKit のインスタンス君たちである。ツベコベいはず、Controls、Text、Data、Containers などの名前付きのタブから部品をマウスで選び、先程私がダブルクリックしろと言ひ散らして君が放つたらかしにしてる「ウインドウ」にドラッグドロップせよ。
あないみじ。何か表示されるね? ああ、されないなら君の Mac OS X Developer Tools は缺陷品だから、抗議の電話をしたまへ。
**ユーザ設定 [#n90a78bb]
NSUserDefaults Class では、~/Library/Preference に設定ファイルを保存、そこからの設定の読込、を行う。+standardUserDefaults で共有のインスタンスを呼び出せる。

これが "インスタンス" だ。君がこれから作るアプリケーションはこの 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 に適合してゐることになる。

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

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 をラップする。これらは、高速化を圖るための思はれる。

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 の解説に詳しい。

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

また、下記リファレンスの 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]
-http://developer.apple.com/jp/documentation/cocoa/Conceptual/CocoaBindings/
~Cocoa バインディング入門(邦譯版)
-http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CoreData/
~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」(マイコミジャーナル・コラム)


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

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

-NSObject Protocol
-NSKeyValueCoding Protocol
-NSKeyValueObserving Protocol

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

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

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

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

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

*** インスタンス生成(乙): [#mea3fe38]
>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) などのメソッドである。

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

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

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

*** インスタンス生成(丁): [#e7e3e500]
>他にインスタンス生成に於いて俯瞰せしめた際に見渡せることを書連ねる。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 を呼ぶ前に呼び出される。すなはち次の順となる。
 [NSObject load];
 [NSObject initialize];
 [NSString load];
 [NSString initialize];
 [NSMutableString load];
 [NSMutableString initialize];
new クラスメソッドは次の式と等價である
 [NSObject new];
 
 # Pattern1
 NSObject *obj = [[NSObject alloc] init];
 
 # Pattern2
 NSObject *obj = [[NSObject alloc] init];
ただし、new に渡された引數は init にも渡されることになり、alloc と異なり子クラスで上書きしても構はない。

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

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

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

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

>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 メソッドを呼ぶ)
 SEL *aSelector = @selector(:self); # @selector は ObjC の言語構造である
 				# なほこれらの@で始まるこれらの文字をコンパイラへの「ディレクティブ」と呼び、他にも幾つかある。
 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 を繼承しない。クラスとプロトコルの違ひを強調する爲に項を割いた。

*** 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のメモリ管理など參照。
-http://www.nslabs.jp/objc.rhtml
~かんたんObjective-C
-http://homepage.mac.com/mkino2/spec/optimize/foundation.html
~Foundation クラスの最適化

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

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 以降)のためのもので次の表記が可能になる。
 for(id objectItem in array){
 ....
 }
NSCopying、NSMutableCopying は複製するためのプロトコル。NSObject に複製用メソッドは定義されてゐるものの、NSObject はこのプロトコルに關しては實裝してゐない。
 ### NSObject Class: Tasks
 - copy
 + copyWithZone
 - mutableCopy
 + mutableCopyWithZone
 
 ### NSArray, NSDictionary, NSSet: Adopted Protocol
 ## NSCopying Protocol
 - copyWithZone
 ## NSMutableCopying Protocol
 - mutableCopyWithZone

*** 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 の更に基本構成員たちである。
-NSString
-NSData
-NSDate
-NSValue
-NSNumber
-NSIndexSet
-NSNull

*** 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 の構造體といふ位置づけになる。
-NSPoint
-NSSize
-NSRect
-NSRange

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 *、ポインタと同じ大きさ)。

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

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

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

*** 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 がいかに動的な工夫があるか、いかにデザインパターンを實裝するかを綴る。


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