#topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#bd4ea116] #contents(); ////////////////////////////////////////////////////////////////////////////// * 文法 [#ad8bcbfd] //============================================================================ ** class 宣言 [#d8957ea1] - C++, Java で言うところの class に相当するもの - &color(red){''@interface'' クラス名 [: 親クラス名]}; で始まり、 &color(red){''@end''}; で終わる @interface MyClass : SuperClass // コンパイラディレクティヴの開始 - (TYPE)InstanceMethod: 仮引数リスト ; // インスタンスメソッド + (TYPE)Method: 仮引数リスト; // メソッド @end //---------------------------------------------------------------------------- *** インスタンスメソッド [#g574affc] - &color(red){''-''}; で始まる - 返り値型は、 ''-'' に続いて &color(red){''(TYPE)''}; で示される。 -- 返り値を持たない場合は (void) で明示する。 -- 返り値型を明示しなかった場合のデフォルトは、 Objective-C で定義されている &color(red){''id''}; 型と解釈される。 //---------------------------------------------------------------------------- *** メソッド [#ca0c9651] *** クラスメソッド [#ca0c9651] - &color(red){''+''}; で始まる - クラスメソッドにはインスタンスが存在しないため、暗黙の self オブジェクトを使うことは出来ない //============================================================================ ** class の実装 [#x164eac8] - ここでもコンパイラディレクティヴ &color(red){''@''}; によって括られる。 - class の実装は、 &color(red){''@imprementation''}; と &color(red){''@end''}; で括られた中に実装される。 @imprementation MyClass : SuperClass - (TYPE)InstanceMethod: 仮引数リスト { // インスタンスメソッドの実装 } + (TYPE)Method: 仮引数リスト { // メソッドの実装 } @end //============================================================================ ** class instance の生成 [#wab45d07] - class instance を生成する場合には、そのクラスの alloc を呼び出す。 - 下記の例では、クラス MyClass のインスタンスを生成し、 id 型の変数 obj に格納している。 id obj = [ MyClass alloc ] -- alloc メソッドは、Objective-C の全ての class の親クラスとなる Object ルートクラスに定義されており、これを呼び出すことで MyClass 型として適切にメモリを割り当てられる。 - class を、メソッドを1回呼んで使い捨てにする場合は、下記のような呼び出し方も可能である: [[MyClass alloc] MyMethod] //============================================================================ ** メソッドの呼び出し [#j1606910] - メソッドの呼び出しは、 id obj = [ MyClass alloc ]; // class instance を生成し、変数 obj に格納 [ obj Method ]; // obj に割り当てられた class が持つメソッド Method を呼び出し ////////////////////////////////////////////////////////////////////////////// * Links [#vc35abbb] - [[Nito's Page>http://wwwa.dcns.ne.jp/~nito/]] - [[Objective-C入門>http://wisdom.sakura.ne.jp/programming/objc/index.html]] - [[【コラム】ダイナミックObjective-C (1) CocoaとObjective-Cと動的なオブジェクト指向 - Cocoaハックの第1歩 | エンタープライズ | マイコミジャーナル>http://journal.mycom.co.jp/column/objc/001/]] - [[Objective-Cは特殊な言語? - @IT>http://www.atmarkit.co.jp/fcoding/articles/objc/objc01/objc01a.html]] ////////////////////////////////////////////////////////////////////////////// * 必要なパッケージ(Debian) [#v0139ef9] gobjc gobjc++ (Objective-C++を使う場合) //============================================================================ ** GCC の場合 [#y2f81349] - 古いMakefileの記法が必要になる: .SUFFIXES: .m .m.o: $(CC) -c $(CFLAGS) $< - クラスを使ったコードは、リンクするときに、libobjc が必要。 - Foundation/NSObject.hをimportしてコンパイルすると... "error: Foundation/NSObject.h: No such file or directory" というようなエラーが出てしまう。この場合は、libgnustep-base-dev パッケージをインストールすると解決する。 # aptitude install libgnustep-base-dev その他、入れた方が良いかもしれないもの: # aptitude install libgnustep-base-dev # aptitude install gnustep # aptitude install gnustep-devel