Objective-Cの基本
Interface宣言
@interface ClsName { ValueA localValue; } - (void) setValueA: (ValueA) a; - (void) action; @end // ClsName
- InterfaceでLocal変数を宣言
- メソッドsetValueAを宣言
- メソッドactionを宣言
implementationセクション
ソースのBodyにあたる部分
@implementation ClsName : NSObject - (void) setValueA: (ValueA) b { localValue = b; } // setValueA - (void) action { NSLOG (@"in Action"); } // action @end // ClsName
- ClsName : NSObjectはNSObjectクラスを継承する事を意味
- setValueAの引数の変数名はローカル変数名と違う様にする必要
- 変数に同じ名前を付けるとローカルの変数がこの引数の変数に置換されてしまう
コロン(:)付きの名前
引数を取るメソッドのみにコロンを付けて表現する
- (void) scratchTheCat; - (void) scratchTheCat: (CatType) critter;
- scratchTheCatは引数なしのメソッドである事
- scratchTheCat:は引数があるメソッドである事
- 引数なしのメソッドに「:」を付けるとコンパイルエラーが発生するので注意
クラスのメソッドの呼び出し
ClsNameクラスのsetValueA:を呼び出すコード
{ ClsName a; [a setValueA: (ValueA) c]; }
- Class内のメソッドを呼び出す場合は[]で囲む
アクセッサメソッド
Javaでのpropertyと同じ仕組みでセッター、ゲッターを持つ
@interface Car : NSObject { Engine *engine; Tire *tires[4]; } - (Engine *) engine; - (void) setEngine: (Engine *) newEngine; - (Tire *) tireAtIndex: (int) index; - (void) setTire: (Tire *) tire atIndex: (int) index; @end //Car
- setEngine:セッターとして、引数をセットするメソッド
- tireAtIndex:ゲッターとして、tireを返す
- Objective-Cではゲッターに「get」は付けないのがルールである
- 「get」と言う名前のメソッドは、引数よして渡したポインタを介して値を返すメソッドと言う意味がある為
import文「<>」と「””」の差
#import <Foundation/Foundation.h> #import "Engine.h"
- 「<>」で囲まれているのは、プロジェクトから参照するクラスを示す
- 「””」で囲まれているのは、自分が所有している変更可能なファイルを示す
@class宣言
意味:いずれこの名前のクラスが定義されるので、気にせず作業を進めて下さい
importの場合、対象ソースが変更された場合、関連ソースをすべて再コンパイルする必要がある為、ポインタで参照されているクラスの場合「@class」で置換する事が出来る
#import <Cocoa/Cocoa.h> @class Tire; @class Engine; @interface Car : NSObject { Tire *tires[4]; Engine *engine; } @end
- 最終的にmainコードでの実装にすべてimportする必要がある為、途中のクラスでは@classで参照を定義するだけ
Classのdescriptionメソッド
NSLogメソッドにクラスを引数で渡すとdescriptionメソッドが呼ばれNSString型を返す
@implementation ClsName1 - (NSString *) description { return (@”This is ClsName1”); } // description @end // ClsName1 ------------------Codde----------------------- main{ ClsName1 a; NSLog(a); } -------------------Run ---------------------- This is ClsName1
- descriptionは継承されたクラスで再定義するとオーバーライドされてしまう