Objective-C調べたことメモ
メソッド名はコロンも含まれる 「myMethod:」
メッセージキーワード
実装が以下の場合
-(void)ayanami:(NSString*)arg1 :(NSString*)arg2{ }
呼び出しは以下の通り
[h ayanami:@"sinji" sec:@"gendo"];
メッセージキーワードは指定しなくても良い。
実装が以下の場合
-(void)ayanami:(NSString*)arg1 sec:(NSString*)arg2{ NSLog(@"%@ and %@", arg1, arg2); [self asuka:arg1]; }
呼び出しは以下の通り
[h ayanami:@"sinji" sec:@"gendo"];
メッセージキーワードを指定した場合、以下は実行エラーSIGABRTが発生する。
[h ayanami:@"sinji" :@"gendo"];
Object 変数へのアクセッサの生成
@interfaceに@propertyを書く。@implement に @synthesize を書く。
- readwrite: This is default setting.
- readonly : As name says.
- assign: 単純に代入する。デフォルト設定
- retain: When substitute, retain is necessary.
- copy: 代入にオブジェクトのコピーを使用することを指定する。
- nonatomic: Default is atomic setting. For multi-thread.
クラス変数の宣言方法
Objective-Cにはクラス変数は存在しない。必要な場合、.mファイル内に
ファイルスコープのstaticなグローバル変数を宣言する。
@implement Hoge : NSObject static int cVal = 0; @end
外部からこのクラス変数を参照する場合はアクセッサを作ればよい。こんな感じ。
@implementation Hoge : NSObject static int cVal = 333; // クラス変数 +(void)set_cVal:(int)arg{ cVal = arg; } +(int)get_cVal{ return cVal; } @synthesize i; @end #import <UIKit/UIKit.h> int main(int argc, char *argv[]) { Hoge *h = [[Hoge alloc] init]; NSLog(@"%d", [Hoge get_cVal]); [Hoge set_cVal:518]; NSLog(@"%d", [Hoge get_cVal]); return 0; }
isaとは?
クラス情報を示すポインタ。Objective-Cの言語仕様は、「id型も、class型も、クラス定義であるisaで始まる」。構造体で先頭にisaがあれば、何でもオブジェクトになる。らしい。c言語出構造体を作り、その先頭にisaとしてクラス定義へのポインタをおけば、
Objective-Cのオブジェクトになる。c++ではないよ。