objc

メソッドの実装

メソッドの実装は実際の実装部分へのポインタで表現されてて,IMP型の変数になってる. IMP型はobjc.hで, typedef id (*IMP)(id, SEL, ...); と定義される関数ポインタ. 可変長引数で,id型の第一引数,SEL型の第二引数をとり,id型の返り値を返す.

セレクタ

セレクタはSEL型の変数で表現されてて,objc.hで, typedef struct objc_selector *SEL; と定義されている. objc_selector構造体の定義はなく,Opaque構造体というらしい.

メソッド

メソッドはMethod型で定義され,ランタイムAPIを以下のように追いかけていくと,@objc-class.h typedef struct class-method *Method 同じく@objc-class.h struct class-method { SEL method_name; char *method_types; IMP method_imp; } となってて, メ…

クラスの書き方

クラスは通常インターフェース部と実装部を別々のファイルに記述する. インターフェースは拡張子.hのインターフェースファイルに記述する. 実装部は拡張子.mの実装ファイルに記述する. ひとつのファイルに複数のクラスを記述することが可能であるが,通例…

クラス

クラスはClass型で定義されるが,そのClass型はobjc.hで typedef struct objc_class *Class; と定義されている.さらに構造体objc_classはobjc-class.hで, struct objc_class { struct objc_class* isa; struct objc_class* super_class; const char* name;…

クラスオブジェクト

クラスはインスタンス化するまで実体がないんだけど,その実体のないクラスもオブジェクトとして考えましょうということ. 変数,メソッドはインスタンス化してから使用可能になるのが通常だけど,インスタンス化しなくても使用可能な変数,メソッドもある(…

NSObject使う

calc.h #import <Foundation/NSObject.h> @interface calc:NSObject -(int) plus:(int)x y:(int)y; @end calc.m #import "calc.h" @implementation calc -(int) plus:(int)x y:(int)y { return x+y; } @end main.m #import <Foundation/Foundation.h> #import <stdio.h> #import "calc.m" int main(void) { id arp = [[</stdio.h></foundation/foundation.h></foundation/nsobject.h>…

Objective-Cを学ぶ

hello world #import <stdio.h> int main(void){ printf("hello world\n"); return 0; } includeがimportに変わってるだけ $ gcc helloworld.m && ./a.out hello world $拡張子が.mになってるだけ NSLog #import <stdio.h> #import <Foundation/Foundation.h> int main(void){ printf("hello world\n"); </foundation/foundation.h></stdio.h></stdio.h>…