完全なC互換。CocoaはObjective-CのAPI。Cocoaについて学べば必然的にObjective-Cについて学べます。主な開発環境はXcode(または旧Project Builder)。[[プログラミング言語]]
* 目次 [#z9920e6c]
#contents
*新版(構成豫定圖) [#v6dbd455]
*Objective-C [#m05c3047]
一般的な Object 指向の思想を理解してゐる前提の元に文法事項を解説します。
**クラス(class) [#f65cc3b7]
定義は.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 クラスの定義をした事になる。

註:新たにクラスを定義する場合は、一般に NSObject を繼承したクラスを定義する。その理由は NSObject が Cocoa における一般的な手續きを全て網羅してゐるからである。またその他のクラスに於ては、特段の理由や意味がない限り、サブクラスを造らない方が良い(譬へば NSString や NSArray のサブクラスを作製しても思ふ樣にはいかないだらう)。逆に能くサブクラスを作るのは、NSObject の他に、稀だが NSApplication の場合や、或いはサブクラスを作る爲のクラス NSManagedObject 等である。
**メソッド(method) [#d7cd9816]
**メッセージ(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(#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}; に於て記述する。更にこの MyObject のインスタンスを保持した變數 receiver が存在したとすれば、二つのメソッドを呼出すには、
ヘッダにおける括弧の遣ひ方に注目して欲しい。括弧はインスタンスが保持する變數を記述する箇所で、メソッドを記述する箇所ではない。クラスメソッドは+、インスタンスメソッドは-で書き始める規則がある。以後メソッド名と共にクラスメソッドかインスタンスメソッドかを示す際には ± を以て明示する事にする。

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

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

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

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

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

***引數 [#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 アプリケーションを開發するならば、メソッドを呼び出す時は、ヘッダが解析された後に入力支援システムによつて補助が入り、どこにコロンを打ちどこにどんな變數がと云ふ事を惱む必要がなくなる。だから今一番憶えておきたいのは、寧ろメソッドの記述方法である。

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

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

と書ける。

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

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

註:一つだけの引數の場合はラベルがない樣にみえるが、さうではない。上のメッセージは myMethod:、withX:、withY: と云ふ三つのラベルを有してをり、myMethod: の如きメソッド名の樣にみえる表記はラベルを表してゐたに過ぎない。つまりレシーバに引數を送信する爲には必ずラベルをつけたメッセージを送る事になるわけ。この事實は命名の仕方にある程度關聯するので留意されたい。

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

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

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

**インスタンス(instance) [#x20a75d7]
今 NSString のメソッドを例にすると、

++ 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 は眞僞値を返す例と同じだが、インスタンス比較用のメソッドに限る物である。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 を參照。

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

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

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

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

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

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

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

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

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

**メモリ管理 [#i43c7ce1]
NSObject Protocol として NSObject に實裝されてゐる +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説します。
NSObject Protocol として NSObject に實裝されてゐる +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説する。
**NSObject クラス [#g74b4db7]
**プロトコル(protocol) [#z2525404]
**カテゴリ(category) [#pd8556d6]
**サブクラス(subclass) [#ta05093a]
**プロパティ(property) [#d8670d8d]
**二三の特異な型 [#id5b20c8]
**Cocoa との關聯 [#hfb31c25]
*附録:Objective-C [#v8ad2bf8]
**ディテクティブ(directive) [#z984e5a5]
**NSZone と malloc [#kc372fb6]
**Xcode でのビルド [#j0dbbe0f]
Xcode は Apple による工夫によつて擧動に「癖」がある。
***對象とする Mac OS X の System [Active SDK] [#r47599da]
***ビルド構成 [#zbbd002c]
***ターゲット(target) [#f63780de]
***リンカ(linker) [#r87355c5]
***ヘッダファイル [#k4c8ea24]
***デバッガ(debugger) [#oc7dc096]
***pch ファイルとプリコンパイル [#lfe69b50]
***32bit か 64bit か [#a166d541]
***PPC か Intel か [#tcfa7e7b]
***VMX(AltiVec) と SSE [#o2008692]
**參考等 [#u5f76e97]
*Cocoa [#w46bc7aa]
**Xcode(舊Project Builder) [#h871a571]
**XIB (NIB) ファイルと Interface Builder [#vece2793]
**アウトレット(Outlet)とアクション(Action) [#l95742c6]
**コントローラオブジェクト(Controller object) [#tdf38a4a]
**バインディング(Binding) [#d75a1c73]
**Foundation Framework [#i8aa10b0]
**AppKit Framework [#kab41712]
**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 [#b1729896]
***NSNumber, NSValue [#ofc3361f]
***NSArray [#jb8f8fd9]
***NSDictionary [#me332d26]
***NSIndexSet [#pf79c05f]
**AppKit Framework API [#dd49e84f]
***NSButton [#fc28156d]
***NSTableView [#q7a0c19b]
**參考等 [#s7e8ffef]
*Apple Developer [#k4f0a384]
**Xcode の Install と Download [#w411ca75]
**SDKs [#be042210]
**分散コンパイル [#lcac35b1]
**Document [#o447cf70]
**Open Source [#n217db5f]

*舊版 [#y05bde43]
* Objective-C とは何ぞや [#p8dfc4ca]
Objective-C のコンパイラは完全な C 互換を提供する大變すぐれたオブジェクト指向言語。動的型による「クラス型オブジェクト指向ランタイム」。現在に於いて言語仕樣イコールアップルと思へばよい程に、アップルがこの仕樣を擴張して居る。

NeXTstep が OPENSTEP といふ OS の開發環境として採用し、それが Mac OS X として採用されたため、Mac OS X での主な開發環境は Objective-C となつて居る。C++ の比べてややマイナー。C++ は Mac OS X に於いては USB ドライバだとか IO Kit 系で使ふことがあるらしい。

Cocoa の實裝は Java に影響を與へた。 Smalltalk といふ氣持ち惡い言語の概念に多く影響を受けて居る。

** Objective-C のディレクティブ [#c49127d4]
ディレクティブてのはソース内部でコンパイラ及びプリプロセッサが理解する恰もコマンドが如き類ひである。ソースコードを讀み書きする前に理解しておきたい。

*** プリプロセッサのディレクティブ [#y9bbb61b]
Objective-C では C のプリプロセッサに次の擴張を施した
-#import
-//
#import は #include と同じだが、一度しか讀み込まない。// は行末迄コメントと解する。
*** コンパイラのディレクティブ [#y4e82e73]
Objective-C では C のプリプロセッサに次の擴張を施した。必ず "@" から始まる。
-@interface
-@implementation
-@protocol
-@end

これらはクラス、カテゴリ、プロトコルを宣言する手段である。@end で宣言を閉ぢる。詳しくは後述。

インスタンス變數の可視性は次の宣言で示す。初期設定は@protectedである。
-@private
-@protected
-@public

例外処理は次をサポートする。@finally が強制實行部位で、あとはお馴染みか。
-@try
-@throw
-@catch()
-@finally

更に特定の目的が爲、次が用意される。
-@class
-@selector(method_name)
-@protocol(protocol_name)
-@encode(type_spec)
-@"string"
-@"string1" @"string2" ... @"stringN"
-@synchronized()

** 言語仕樣 [#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 はグつとわかりやすいものになる。

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

** AppKit とは [#e8646e9f]
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 ⌘/」を選びたまへ。次にこれもおそらく表示されてると思ふけど、パレットにカラフルなイラストで彩られた上段のタブなければ、右上のボタンで表示するやうに。

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

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