itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

詳解Objective-Cの自習メモ[Chapter7]

Objective-Cを勉強してて、忘れないようにメモ残したらいんじゃね?
って思ったので今日からやる。

すでにchapter7まで来て、今日は宣言プロパティをやった。

宣言プロパティ

interfaceで定義するインスタンス変数に、コンパイラ指示子をつけると
アクセサメソッドを良しなに作ってくれる便利機能。

実際に実装してみた奴

#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が使えない。