詳解Objective-Cの自習メモ[Chapter7]
Objective-Cを勉強してて、忘れないようにメモ残したらいんじゃね?
って思ったので今日からやる。
すでにchapter7まで来て、今日は宣言プロパティをやった。
実際に実装してみた奴
#import <Foundation/NSObject.h> #import <Foundation/Foundation.h> @interface Creature : NSObject { NSString *name; int hitPoint; int magicPoint; } - (id)initWithName:(NSString *)str; @property(readonly) NSString *name; @property int hitPoint; @property(readonly) int level; @end @implementation Creature - (id)initWithName:(NSString *)str { if ((self = [super init]) != nil) { name = str; hitPoint = magicPoint = 10; } return self; } @synthesize name; @synthesize hitPoint; @dynamic level; - (int)level { return (hitPoint + magicPoint) / 10; } @end int main(void) { Creature *obj; obj = [[Creature alloc] initWithName:@"test"]; printf("%s\n", [[obj name] UTF8String]); // test printf("%d\n", [obj hitPoint]); // 10 // printf("%d\n", [obj magicPoint]); // methodがないからコンパイルエラー printf("%d\n", [obj level]); // 2 // [obj setName:@"test2"]; // methodがないからコンパイルエラー [obj setHitPoint:100]; // コンパイラが勝手に生成 // [obj setLevel:10]; // methodがないからコンパイルエラー printf("%s\n", [[obj name] UTF8String]); // test printf("%d\n", [obj hitPoint]); // 100 printf("%d\n", [obj level]); // 11 return 0; }
@property/@property(readonly)
自動的にアクセサ作らせるために、宣言部分で指定する構文。
@propertyだとゲッターとセッターの両方。
readonly付けるとゲッターのみ。
@synthesize
実装時に、対象のインスタンス変数であることを指定する。
@propertyとセットにしないとコンパイルエラー。
@dynamic
@property付けたけど、自分でアクセサ実装することを明示する。
@dynamic付けて実装しなかった場合は、コンパイルエラーにならない。
実行したら落ちる(l゚Д゚)ヒッ!!
その他
#import <Foundation/Foundation.h>
このヘッダをimportしとくと、stdio.h読み込まなくてもprintfが使える。
あと、importしないと、UTF8Stringが使えない。