完全な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 指向の思想を理解してゐる前提の元に文法事項を解説します。
**クラス(class) [#f65cc3b7]
定義は.hファイル、實裝は.mファイルに書く。Xcode で新たに書類をプロジェクト追加する際に、Objective-C Class テンプレートを選ぶと、.hファイルと.mファイルが自然に追加される。
完全なC互換。CocoaはObjective-CのAPI。~
Cocoaについて学べば必然的にObjective-Cについて学べます。~
主な開発環境はXcode(または旧Project Builder)。

#contents

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

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

-id(任意のレシーバを表す型)
-SEL
-IMP
-Method
-Class
-BOOL

言語構造上の変数は 

-nil
-self
-super
-YES
-NO

など。

**クラス(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 等である。
**メソッド(method) [#d7cd9816]
今先程のクラスに、インスタンス變數 obj、クラスメソッド myClassMethod、メソッド myMethod を追加したとすると、
*** 命名規約(クラス) [#classname]
クラスは大文字で始める。自身のクラスに接頭辞を付ける際、
NS(NeXTSTEP)や IO(Input-Output)や OS(Operating System) や CG(Core Graphics)はAppleによって既に使われていて紛らわしいので避けよう。

**メッセージ(message)/メソッド(method) [#method]
先程のクラスに、インスタンス変数 obj、クラスメソッド myClassMethod、メソッド myMethod を追加すると、

>&color(#007900){// MyObject.h};~
&color(#CB0094){@interface}; MyObject : NSObject{~
''&color(#CB0094){id}; obj;''~
   ''&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(#007900){/// your code};~
''}''~
''-(&color(#CB0094){id};)myMethod''~
''{''~
''&color(#CB0094){return}; obj;''~
   ''&color(#CB0094){return}; obj;''~
''}''~
&color(#CB0094){@end};

ヘッダにおける括弧の遣ひ方に注目して欲しい。括弧はインスタンスが保持する變數を記述する箇所で、メソッドを記述する箇所ではない。クラスメソッドは+、インスタンスメソッドは-で書き始める。メソッドは @ の圍み、@interface ~ @end、@implementation ~ @end に於て記述する。更にこの MyObject のインスタンスを保持した變數 receiver が存在したとすれば、二つのメソッドを呼出すには、
ヘッダにおける括弧の使い方に注目。括弧内はインスタンス変数を記述するものであり、メソッドは別で定義する。
クラスメソッドは+、インスタンスメソッドは-で書き始める規則がある。~
メソッドは、&color(#CB0094){@interface}; ~ &color(#CB0094){@end}; と &color(#CB0094){@implementation}; ~ &color(#CB0094){@end}; において記述する。

 [MyObject myClassMethod];
 [receiver myMethod];
MyObject のインスタンスを保持した変数 receiver が存在したとして、二つのメソッドを呼び出すには、

と書く。Objective-C に於てインスタンスはレシーバと呼ばれるが、その意味は、Objective-C に於けるメソッドの呼出され方・動作に由來する。一般に「レシーバにメッセージを送る」と謂へば、インスタンスのインスタンスメソッドを起動する事を意味する。
>[&color(#277075){MyObject}; &color(#13484C){myClassMethod};];~
[receiver &color(#13484C){myMethod};];

註:id型はObjective-Cに於て新たに定義された型の一つで、任意のレシーバを表す型である。この樣な汎用的な型については附録參照。
と書く。Objective-C においてはインスタンスをレシーバと呼ぶ。
「レシーバにメッセージを送る」と言えば、インスタンスメソッドを起動する事を意味する。

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

 [receiver myMethod:value];
***引数 [#args]
id 型の変数 value を -myMethod に渡す場合、

と書く。メソッド名の後に :(コロン)を打つて引數を書くと、レシーバにメッセージが送信される。上の定義と實裝を書き直せば、
>[receiver &color(#13484C){myMethod};:value];

 //MyObject.h
 @interface MyObject : NSObject{
  id obj;
 }
 +(void)myClassMethod;
 -(id)myMethod;
 @end
 //MyObject.m
 @implementation MyObject
 +(void)myClassMethod{
  /// your code
 }
 -(id)myMethod{
  return obj;
 }
 @end
と書く。メソッド名の後に :(コロン)を打って引数を書くと、レシーバにメッセージが送信される。上の定義と実装を書き直せば、

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

***ラベル [#c741a9fc]
**インスタンス(instance) [#x20a75d7]
**メモリ管理 [#i43c7ce1]
**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]
>&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};

*舊版 [#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 系で使ふことがあるらしい。
註:Xcodeならインテリセンスが効くので、呼び出し時の変数の書き方に悩む必要はない。

Cocoa の實裝は Java に影響を與へた。 Smalltalk といふ氣持ち惡い言語の概念に多く影響を受けて居る。
***可変長引数 [#variadic]
C における可変長と同じく、可変長引数を id 型とすれば

** Objective-C のディレクティブ [#c49127d4]
ディレクティブてのはソース内部でコンパイラ及びプリプロセッサが理解する恰もコマンドが如き類ひである。ソースコードを讀み書きする前に理解しておきたい。
>+(&color(#CB0094){void};)myClassMethod:(&color(#CB0094){id};)objects, ...;~

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

これらはクラス、カテゴリ、プロトコルを宣言する手段である。@end で宣言を閉ぢる。詳しくは後述。
***ラベル(label) [#label]
Objective-C で最も一般的な複数引数の記述・利用法がラベルである。引数に名前を指定する。座標を渡すメソッドならば、

インスタンス變數の可視性は次の宣言で示す。初期設定は@protectedである。
-@private
-@protected
-@public
>[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;~

例外処理は次をサポートする。@finally が強制實行部位で、あとはお馴染みか。
-@try
-@throw
-@catch()
-@finally
と書く。C の関数等で myMethod(val,num1,num2); と書くと引数の意味が取りづらいが、
Objective-C では上にある様に見た目に分かり易くなっている。

更に特定の目的が爲、次が用意される。
-@class
-@selector(method_name)
-@protocol(protocol_name)
-@encode(type_spec)
-@"string"
-@"string1" @"string2" ... @"stringN"
-@synchronized()
またこのラベルは同じメソッドで複数用意できる。
myMethod:withX:withY:withZ: なるメソッドを作りたいと思った時、myMethod:withX:withY: と myMethod:withX:withY:withZ: は共存できる。

** 言語仕樣 [#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
//***メソッドの上書き(override) [#override]
//<準備中>

* Cocoa とは何か [#c95819d5]
Cocoa とは、Foudation Frameworks、CoreData Frameworks、AppKit Frameworks により構成される Objective-C の API 群である。
***命名規約(メソッド) [#methodname]
Cocoa API を見て行くと以下のような暗默の了解がある。一貫性は大事なので従っておこう。

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

抽象的で申し訣ないが、要するには Cocoa の頻出データ型を定め頻出する機能を纏めたやつである。MVC でいへば Model の提供が主で Controller の技術的補助(オブザーバなど)、View に渡すデータなどの役割を擔ふ健氣なやつ。
+ 初期化
+++ 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 のポインタを渡してインスタンスから値を取得する場合に用いる(つまり参照渡しの)メソッドである。

** AppKit とは [#e8646e9f]
AppKit は、ApplicationKit の略である。Kit の接尾辭は Apple では擴張的であれど基本的な API 群につけるらしく、たとへば Safari の KHTML エンジンは WebKit Frameworks で實裝される。Cocoa にラップされた QuickTime API は QTKit である。
**レシーバ(receiver)/インスタンス(instance) [#receiver]
Objective-C のインスタンスは C のポインタなので、変数の型に * が必要。

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

さあ簡單に説明しよう。これが Cocoa AppKit のインスタンス君たちである。ツベコベいはず、Controls、Text、Data、Containers などの名前付きのタブから部品をマウスで選び、先程私がダブルクリックしろと言ひ散らして君が放つたらかしにしてる「ウインドウ」にドラッグドロップせよ。
あないみじ。何か表示されるね? ああ、されないなら君の Mac OS X Developer Tools は缺陷品だから、抗議の電話をしたまへ。
***レシーバの初期化 [#init]
レシーバの初期化は上にあげた +alloc, -init がもっとも基本的な物であるが、ファクトリメソッドが用意されることもある。

これが "インスタンス" だ。君がこれから作るアプリケーションはこの Interface Builder で概觀をデザインすることになる。
alloc と init は NSObject で定義されており、Objective-C の根幹を成すメソッドの一つである。
alloc がレシーバにメモリを割り当て、init がこれを初期化する。

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

すでに他のオブジェクト指向を味はつた貴方に説明するなら、これは 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 に適合してゐることになる。
***nil の扱い[#nilreceiver]
nil に存在しないメッセージを送信しても、余計なエラーが発生しない。

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

MVC でいへば、まさしく View を擔當することは先程の Interface Builder でよくわかつたかと思ふ。Controller もちょっち擔當。
**メモリ管理 [#gc]
Objective-C のメモリ管理は「参照カウント」と「ガベージコレクション」が用意される。ここでは参照カウントにまつわるメソッド、つまり NSObject に実装されている NSObject Protocol の +alloc、-init、-retain、-release、-autorelease、そして NSAutoreleasePool class を解説する。なおガベージコレクションを利用する場合は Mac OS 10.5 以降に導入されたため以前のバージョンと互換性がない事に注意。

** 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 をラップする。これらは、高速化を圖るための思はれる。
+alloc はメモリを割り当てたオブジェクトを返す。malloc 同様確保に失敗すれば nil を返す。生成されるオブジェクトの参照カウント は 1 となる。
+init はオブジェクトを初期化する。Cocoa はこの二段構えにする事でオブジェクト生成に柔軟性を与えている。
+retain はメモリ割り当てを解放しない為の手続きである。参照カウントを 1 増やす。
+release はメモリ割り当てを解放する為の手続きである。参照カウントを 1 減らす。

WebObjects はマイナーの嫌ひがあるので説明せば、Mac OS X に無料でバンドルされる Java Servlet の類ひである(なほ元々は純粹なobjcだつたがversion.5よりJavaになつた)。EOF は WebObjects の賣りのひとつで、 サーバ毎に Adaptor を巧みに遣ひわけ猶且つ SQL をデヴエロツパが書く事無くして DataBase を操作する代物であつた。
一般に上から順に実行する。任意の瞬間にオブジェクトを解放するならば、retain によりカウンタを増し release によりカウンタを減らせばよい。release は参照カウントが 0 になればオブジェクトを解放してくれる。

Core Data は、主に書類を扱ふ際に威力を發揮する。EOF との違ひは、EOF は Java Servlet といふ用途に沿ふ實裝だが、Core Data はデスクトップアプリケーションの爲の API であるといふことである。そこらへんのことは Apple の Core Data の解説に詳しい。
註:-retainCount によりカウンタを取得できる。NSLog(@"%d", [receiver retainCount]); と呼び出して、カウンタの動作を確認して欲しい。

** 總括 [#g7b6c91b]
長くなつたけど、序論である。AppKit に項目を割いたのは Cocoa GUI に於いてとても重要であるからである。
註:ガベージコレクションでは、nil を代入する事が、解放の目安となる。従って不要な変数には nil を代入すること。

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

** 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
***初期化とメモリ解放時の処理 [#allocation]
クラスの初期化には +load, +initialize を用いる。これはただ一度だけ呼び出される。+load は Runtime 上に追加された時に、+initialize は初めてそのクラスを用いる時に呼び出される。

** 參考 [#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」(マイコミジャーナル・コラム)
インスタンスの初期化は -init 等の指定イニシャライザで行う。

メモリ解放時の処理は -dealloc, -finalize で行う。-dealloc は参照カウンタにおける解放、-finalize はガベージコレクタにおける解放で自動的に呼び出される。
ただし、必ず呼び出されると期待しない方がよく、アプリケーションの終了時に必要な処理を記述する事は避けた方がよい
(例えば、NSApplication に -terminate とすると、OS が強制的にメモリを回収するらしく、-dealloc を呼ぶ事がない)。

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

** NSObject・・・オブジェクトの生成 [#t4bf3fcd]
NSObject はルートクラスであり、次のプロトコルに "接續" する(Adopted Protocol)。
***autorelease と NSAutoreleasePool [#rf888730]
上で示した仕組みでは時に問題が起こる。メソッドの戻り値としてメソッドが生成したオブジェクトを返す場合である。

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

これらのプロトコルで實裝されるのはインスタンスメソッドのみとなる。Cocoa では次のステップを踏みインスタンスを生成する。
このメソッドの戻り値を利用する場合、戻り値を取得した時点でカウンタは 1 となり、-release しなければ解放が起こらずリークする。~
この場合、autorelease を呼び、Autorelease pool に追加することで問題を解決できる。

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

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

>後述の NSArray や NSString といつたクラスのクラスメソッドには次の物がある。
 + array
 + arrayWithArray
 + string
 + stringWithCString:encoding:
 + allocWithZone
 + new
array*** とあるのは NSArray の Factory であり、string*** とあるのは NSString の Factory にあたる。Cocoa の Factory は戻り値として初期化する前のインスタンスを返す。なほ Objective-C では + を伴ふメソッド定義がクラスメソッドを示す。
註:以上の事から、指定イニシャライザで取得したインスタンスの場合は、代入的手段を直接行ってはならないとわかる。どうしてもその必要のある場合は、NSLog([[[[NSObject alloc] init] autorelease] description]); と、-autorelease の戻り値を利用する事で解決できる。

>割り當てられた領域は NSZone クラスのインスタンスとして(zone メソッドにより)取得することができ、allocWithZone で生成すれば同じ領域を使用できる。また、參照カウント及びインスタンス變數の初期化を行ふ。ここに於いて isa インスタンス變數の決定といふ重大な過程を經過する。
註:通常の開発では、NSApplication が NSAutoreleasePool のインスタンスを生成しているから、autorelease はこのままで動作する。
しかし Cocoa Application 以外の Cocoa を利用した開発では、自前の Autorelease pool を用意する必要がある。
また、任意に -drain を呼んでやる必要がでてくる。この -drain は pool のインスタンスに -release を送信する。

*** インスタンス生成(乙): [#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) などのメソッドである。
>NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];~
/* code */~
[pool drain];~

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

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

>正確な意味での garbage collection は Objective-C 2.0 への擴張で組み込まれ Leopard より實裝された。保守的(conservative)な GC である。
***戻り値の規約 [#n605ab08]
-+alloc, +allocWithZone:
--copy, -mutableCopy, +copyWithZone:, +mutableCopyWithZone:

*** インスタンス生成(丁): [#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 と異なり子クラスで上書きしても構はない。
これらで取得する場合は retain されているので、プログラマの責任で release せねばならない。

>dealloc はメモリ解放を行ひ、release により呼び出される。明示的に dealloc を呼ぶ事は無い。獨自のメモリ解放機構を備へるなど子クラスで再定義できる。
**NSObject クラス [#g74b4db7]
Cocoa における Root class の一つ。

>finalize は dealloc に代はり呼び出される。GC が有效なとき、autorelease を呼んだときなど(よくわからんから調査中)。
**プロトコル(protocol) [#z2525404]
Ruby における module みたいな奴。任意のクラスにいくらでも適用できる。手法は明示的なものと暗黙的なものの二種類ある。
**カテゴリ(category) [#pd8556d6]
定義済のクラスを拡張できる、Objective-C でも一・二を争う邪悪で、そして便利な手段である。例えば今 NSString に base64 encoding のメソッドをつけ加えてみたいと思うならば、カテゴリを用いることで実現できる。
**サブクラス(subclass) [#ta05093a]
**プロパティ(property) [#d8670d8d]
**よく使う構造体 [#id5b20c8]
以下の四つの構造体はよく使う。これらは KVC でも始めからサポートされる構造体で、特別な扱いを受けている。

>description 則ち「説明」とあるけど、これは NSString にインスタンスを變換しこれを返す。所謂「toString」「to_s」 などのメソッドと考へて欲しい。isEqual は何が「イコールか?」と云ふとインスタンスの hash メソッドを用ゐて比較した眞僞値を返す。たとへば、NSString クラスでは hash メソッドが再定義され、同時に isEqualToString が追加された。isEqualToArray、isEqualToDate、isEqualToSet など似たメソッドは澤山ある。self はインスタンス自身を返すメソッド。
+NSSize
--NSView 及びそのサブクラスでよく使うことになる。NSMakeSize。
+NSPoint
+NSRect
+NSRange
--配列なんかで用いる。NSMakeRange で生成できる。

>zone は先述の NSZone を作つて返すメソッド。これは allocWithZone、copyWithZone といつたやうなクラスメソッドなどの引數となる。
*附録:Objective-C [#v8ad2bf8]
**ディレクティブ(directive) [#z984e5a5]
Objective-C におけるコンパイラ及びプリプロセッサへの命令について。C 標準は勿論のこと、いくらかの拡張がある。それが以下である。
***コンパイラのディレクティブ [#j3225b9a]
-#import
-//

>performSelector は SEL、IMP、Methodの三つの型を理解する爲に擧げた。一部の例が Ruby で申し訣ないが、次のやうな物である
-SEL型:セレクタ。C の構造體のポインタ型(Opaque、實態はchar型)。Ruby だと Symbol クラス。
-IMP型:メソッドの實裝。C の函數ポインタ。Ruby だと Proc クラスなどか。
-Method型:メソッド。C の構造體で、SEL型・IMP型・char型を格納する。
#import は #include に同じだが、一度しか読み込まない点が異なる。// は行末までコメント扱い。
***プリプロセッサのディレクティブ [#s52514b5]
クラス等は以下のように宣言する。

>
 ### 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 を繼承しない。クラスとプロトコルの違ひを強調する爲に項を割いた。
-@interface ~ @end
-@implementation ~ @end
-@protocol ~ @end

*** 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
-@private
-@protected (初期設定)
-@public

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

-NSMutableArray > NSArray > NSObject
-NSMutableDictionary > NSDictionary > NSObject
-NSMutableSet > NSSet > NSObject
-@try
-@throw
-@catch()
-@finally

またコレクションは次のプロトコルを實裝する。
-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
-@class
-@selector(method_name)
-@protocol(protocol_name)
-@encode(type_spec)
-@"string"
-@"string1" @"string2" ... @"stringN"
-@synchronized()

*** 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プログラミング言語 > 高速列挙
一応説明が必要なのは @"string" であろう。@"string" は quoted な部位を NSString class のレシーバとして処理する構造である。@"abc" と書けば、abc なる文字を保持した NSString class のインスタンスが const として生成される。しかも(同じ stack であればだと記憶するが)@"string" を同メソッド内で何度呼びだしても、同じインスタンスを返してくれる。

** 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)
註:Objective-C 2.0 から、@property, @synthesize, @optional, @required 等が追加された。

** Foundation Data Types [#vfcbfed8]
更に次のやうな型が定義される。これは C の構造體といふ位置づけになる。
-NSPoint
-NSSize
-NSRect
-NSRange
***実行環境のはなし:Architecture について(32-64bit/PPC, Intel) [#xc4cf3a9]
***VMX(AltiVec) と SSE [#o2008692]
**C 言語との関連 [#q1055f75]
***const 及び static [#j0c52aa0]
@"string" でわかるように、const は使用可能。static は singleton で用いる。
***インスタンス変数の扱い [#j3f1c269]
インスタンス変数は C での構造体のメンバの様に宣言運用できる。例としてあげれば、@interface 中に int nums[10]; とできる。
**メソッドの静的呼び出し [#od53fcb9]
メソッドを呼び出す行為は、レシーバの情報から関数ポインタを取出し、それを呼び出しているに過ぎない。今 <objc/objc-class.h> を import した上で、

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;
 id obj = [self getObject];
 Method method;
 Class class = [self class];
 SEL name = @selector(myMethod:);
 method = class_getInstanceMethod(class, name);
 method_getImplementation(method)(self, name, obj);

とすれば、これは [self myMethod:obj]; と同等である。
なお、メソッドを上書きしていなければ、self とは別のインスタンス等でも関数ポインタは同一である。NSLog(@"%p", method->method_imp); として確かめてみればよい。

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

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

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

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

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

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

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

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

例:
+Xcode で新規プロジェクトを選択し、適当な名前の Cocoa Application Project を作る。
+次に新規ファイルを選び、ヘッダを含めて AppController クラスを追加して欲しい。AppController の superclass は NSObect でよい。
+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 ではない方へ追加する。
+次に初期設定では NSObject の インスタンスであるから、Class Identify の Class を AppController にする。
+Gradient Button の Sent Actions の selector に myMessage: を設定する。勿論ターゲットは AppController。Control-Key を押しながら、クリックしてみると・・・?

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;
 
 #if __LP64__
 typedef long NSInteger;
 typedef unsigned long NSUInteger;
 #else
 typedef int NSInteger;
 typedef unsigned int NSUInteger;
 endif
 //   AppController.m
 -(void)awakeFromNib{
       [button setTarget:self];
       [button setAction:@selector(myMessage:)];
 }

NSUInteger は 64bit な Mac と 32bit な Mac に於いての工夫を施すために定義された型となる(註:つまりvoid *、ポインタと同じ大きさ)。
と書き加え、定義した outlet が機能するようにボタンへ接続しておけばよい。outlet の接続を行うことで、
GUI 部品のインスタンスをコントローラ上で取得できるようになる。

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

CGFloat 型は「CGGeometry Reference(CGBase.h)」に説明があるけれども、要するにfloat(double)型である。これらを列擧した理由は NSValue がサポートする物だからに他ならない。NSValue がサポートできる型の値は KVC の自動ラッピング機構を利用できる。
***File's Owner [#mb20f88d]
Nib ファイルにはその所有者である File's Owner が必ず設定される。それは、

また次の定義濟函數で各々の型を作ることができる。
 NSMakePoint(x, y)
 NSMakeRect(origin,size)
 NSMakeSize(width, height)
 NSMakeRange(location, length)
-NSMainNibFile においては NSApplication。
-Document-based Application の Document 用 Nib ファイルでは NSDocument のサブクラス。
-Window 用 Nib ファイルでは、NSBundle の +loadNibNamed:owner: で指定した物か、或いは NSWindowController のサブクラス。
-Custom View 用 Nib ファイルでは、適当な Object、或いは NSViewController のサブクラス。

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

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

* 参考[#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 がいかに動的な工夫があるか、いかにデザインパターンを實裝するかを綴る。
-[[Cocoa Binding : バインディングって何なのさ:http://sitearo.com/cocoa/1100_binding/01_whats/]]

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

**AppKit Framework [#kab41712]
Application Kit (AppKit) には、さまざまな御約束がある。ある程度馴れてくると、ヘッダをみて、通知や委譲がないか確かめたり、クラスの使い方がわかるようになる。
**CoreData Framework [#pc166909]
**二三の重要なプロトコル [#v3043586]
***NSObject Protocol [#o8819deb]

-[[NSObject Protocol Reference:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/]]

***NSKeyValueCoding Protocol と NSKeyValueObserving Protocol [#da4d02be]
Protocol と呼ばれてはいるが、どちらかというと、文法として組み込まれていると考えてよい。setter、getter による binding と監視を実現する。

-[[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 的な表現に置き換わるので、やや早い。

-[[NSFastEnumeration Protocol Reference:http://developer.apple.com/library/mac/#documentation/cocoa/reference/NSFastEnumeration_protocol/]]
***NSCoding Protocol [#o16d5326]
NSDocument Class を使ったアプリケーションで書類を保存する時なんかに大活躍。NSKeyedArchiver, NSKeyedUnarchiver Class とあわせて使う。

-[[NSCoding Protocol Reference:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/]]
***NSCopying Protocol と NSMutableCopying Protocol [#h1b3bb41]
インスタンスをコピーするための手続き。shallow か deep かは実装まかせ。

-[[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 に切り替わる。

長くなるので丸投げ。その内、NSBundle Class の仕組みと strings の使い方ぐらいは書く。

-[[Internationalization and Localization:http://developer.apple.com/internationalization/]]

**ユーザ設定 [#n90a78bb]
NSUserDefaults Class では、~/Library/Preference に設定ファイルを保存、そこからの設定の読込、を行う。+standardUserDefaults で共有のインスタンスを呼び出せる。


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