完全なC互換。CocoaはObjective-CのAPI。Cocoaについて学べば必然的にObjective-Cについて学べます。主な開発環境はXcode(または旧Project Builder)。プログラミング言語
鋭意作製ちゅう。
Cocoa とは、Foudation Frameworks、CoreData Frameworks、AppKit Frameworks により構成される Objective-C の API 群である。
Foudation は、そのまま「基層」の意である。化粧をする貴方には下地(ファンデ)でおなじみ。Cocoa で尤も酷使される可哀想なやつ。一方で、これの扱ひになれれば Cocoa API はグつとわかりやすいものになる。
抽象的で申し訣ないが、要するには Cocoa の頻出データ型を定め頻出する機能を纏めたやつである。MVC でいへば Model の提供が主で Controller の技術的補助(オブザーバなど)、View に渡すデータなどの役割を擔ふ健氣なやつ。
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 形式でシリアライズされてをり、Mac OS X のアプリケーションは起動時にこれを參照し復元して GUI 環境を提供してくれる。plist は Foudation の一部のクラスをシリアライズする物で記法は三種類ほど存在する。よく使ふので別項で解説する。nib ファイルはアプリケーションバンドルに必ずあるので、「パッケージの内容を表示」して探してみて欲しい。
MVC でいへば、まさしく View を擔當することは先程の Interface Builder でよくわかつたかと思ふ。Controller もちょっち擔當。
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 の解説に詳しい。
長くなつたけど、序論である。AppKit に項目を割いたのは Cocoa GUI に於いてとても重要であるからである。
また、下記リファレンスの URI に於いて CoreData を除き「ObjC_classic」とあるのは何故かと思はれるかも知れないので付け足して置くと、Foundation と AppKit は OPENSTEP 時代からの遺産であつて、Core Data は Mac OS X Tiger(v.10.4) より導入されたに過ぎない。 ゆゑにクラシックなのである。
Foundation Framework Reference
AppKit Framework Reference
CoreData Framework Reference
Cocoa バインディング入門(邦譯版)
Core Data プログラミングガイド(邦譯版)
「キー値コーディング」及び「キー値監視」について(邦譯版)
Core Data のレビュー記事。KVC、KVO、Cocoa Bindingにも觸れる「TigerのCocoaにみるMVCの完成 - スマートなデータモデルを実現するCore Data」(マイコミジャーナル・コラム)
Foudation Frameworks は Carbon の完全なラッパーとなつて居る。幾つか憶えるべき最低限のものを擧げてみれば、それは NSString、NSArray、NSDictionary などのクラスである。まづ、基本的なクラスを紹介する。
NSObject はルートクラスであり、次のプロトコルに "接續" する(Adopted Protocol)。
これらのプロトコルで實裝されるのはインスタンスメソッドのみとなる。Cocoa では次のステップを踏みインスタンスを生成する。
NSObject *obj = [NSObject alloc]; [obj init]; [obj autorelease];
alloc はデザインパターンの Factory にあたり、Objective-C ではこのクラスメソッドがメモリ確保を行ふ。絶對に子クラスで上書きしてはならない。なほ alloc は NSObject に實裝されてゐる。これを「割り當て」と呼ぶ。他の言語のやうに new Class といふ記法はないが、new メソッドが存在する(後述)
後述の NSArray や NSString といつたクラスのクラスメソッドには次の物がある。
+ array + arrayWithArray + string + stringWithCString:encoding: + allocWithZone + newarray*** とあるのは NSArray の Factory であり、string*** とあるのは NSString の Factory にあたる。Cocoa の Factory は戻り値として初期化する前のインスタンスを返す。なほ Objective-C では + を伴ふメソッド定義がクラスメソッドを示す。
割り當てられた領域は NSZone クラスのインスタンスとして(zone メソッドにより)取得することができ、allocWithZone で生成すれば同じ領域を使用できる。また、參照カウント及びインスタンス變數の初期化を行ふ。ここに於いて isa インスタンス變數の決定といふ重大な過程を經過する。
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 型がオブジェクトを指す。
autorelease は自動で release する、すなはちメモリ解放の爲の手續きである。最近の言語では garbage collection は最早定番とも言へるがこれも似た手段である。解放プールに入れると表現されるが、それはアプリケーション起動時に NSApplication が NSAutoreleasePool クラスのインスタンスを作り、これに叩き込んで監視するからである。
- autorelease - release - retain - retainCountNSObject Protocol によつてこれらのインスタンスメソッドが定義される。autorelease は明示的に release をするのと變はらぬ效果を與へる。retain は參照カウンタを増大させ release は參照カウンタを減少させるものだが、NSArray といつたコレクションクラスに插入すると自動的に retain が呼ばれ參照カウンタが増える仕組みになつて居る。不要になれば release か autorelease を呼ばねばならない。
正確な意味での garbage collection は Objective-C 2.0 への擴張で組み込まれ Leopard より實裝された。保守的(conservative)な GC である。
他にインスタンス生成に於いて俯瞰せしめた際に見渡せることを書連ねる。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 など似たメソッドは澤山ある。
オブジェクトの作成 < Cocoaオブジェクト < Cocoa基礎ガイド
オブジェクトの割り当てと初期化 < ランタイムシステム < Objective-C 2.0プログラミング言語
マイコミの「ダイナミックObjective-C」コラム。オブジェクトについては14~17あたりをみてほしい。GC については96~100。
Cocoaプログラミングの話題。Cocoaのメモリ管理など參照。
かんたんObjective-C
Foundation クラスの最適化
Cocoa では次のコレクションが用意される。繼承關係も示した
NSArray は配列、NSDictionary は辭書(ハッシュ)、NSSet は集合(聚合、重複を許さぬ配列)です。このクラスに格納したオブジェクトは變更することができません(Immutable)。變更する(Mutable)を望む場合は次のクラスを使用して下さい。
一方で次のやうなデータ型的な物がある。Primitive とあるやうに基本である Foundation の更に基本構成員たちである。
更に次のやうな型が定義される。これは C の構造體といふ位置づけになる。
CGFloat、NSUInteger などの型を格納する。そんなにややこしいものでもないので「Foundation Data Types Reference」及びヘッダファイルより拔萃。
typedef struct _NSPoint { CGFloat x; CGFloat y; } NSPoint; typedef struct _NSRect { NSPoint origin; NSSize size; } NSRect; typedef struct _NSRect { NSPoint origin; NSSize size; } NSRect; typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; #if __LP64__ typedef long NSUInteger; #else typedef int NSUInteger; endif
NSUInteger は 64bit な Mac と 32bit な Mac に於いての工夫を施すために定義された型です。CGFloat 型は「CGGeometry Reference」に説明がありますが、要するにfloat(double)型です。
これらを列擧した理由は NSValue がサポートする物だからです。NSValue がサポートできる型は KVC の自動ラッピング機構を利用できます。
本家本元のAppleによる 「Objective-C プログラミング言語」の解説。
ダイナミックObjective-C(マイコミジャーナル・コラム)。Cocoa での Objective-C がいかに動的な工夫があるか、いかにデザインパターンを實裝するかを綴る。