Key-Value Coding

・Key-Value Coding略してKVCなるものがあるということやってみた。
ソース

#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>

@interface MyClass:NSObject
@property(copy) NSString *name;
@end

@implementation MyClass
@synthesize name;
@end

int main () {
	id pool = [[NSAutoreleasePool alloc] init];
	id obj = [[MyClass alloc] init];
	[obj setValue:@"hello world" forKey:@"name"];
	NSLog(@"%@", [obj valueForKey:@"name"]);
	return 0;
}

コンパイルと結果

gcc -c -I/usr/include/GNUstep -fconstant-string-class=NSConstantString main.m
main.m:45:1: エラー: ivar ‘name’ used by ‘@synthesize’ declaration must be an existing ivar
main.m:46:1: 警告: incomplete implementation of class ‘MyClass’ [デフォルトで有効]
main.m:46:1: 警告: method definition for ‘-setName:’ not found [デフォルトで有効]
main.m:46:1: 警告: method definition for ‘-name’ not found [デフォルトで有効]
main.m: 関数 ‘main’ 内:
main.m:51:2: 警告: no ‘-setValue:forKey:’ method found [デフォルトで有効]
main.m:51:2: 警告: (Messages without a matching method signature [デフォルトで有効]
main.m:51:2: 警告: will be assumed to return ‘id’ and accept [デフォルトで有効]
main.m:51:2: 警告: ‘...’ as arguments.) [デフォルトで有効]
main.m:52:2: 警告: no ‘-valueForKey:’ method found [デフォルトで有効]
make: *** [main.o] エラー 1

・「ivar ‘name’ used by ‘@synthesize’ declaration must be an existing ivar」とあるので
ソース修正

#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>

@interface MyClass:NSObject
{
	NSString *name;
}
@property(copy) NSString *name;
@end

@implementation MyClass
@synthesize name;
@end

int main () {
	id pool = [[NSAutoreleasePool alloc] init];
	id obj = [[MyClass alloc] init];
	[obj setValue:@"hello world" forKey:@"name"];
	NSLog(@"%@", [obj valueForKey:@"name"]);
	return 0;
}

コンパイルと結果

gcc -c -I/usr/include/GNUstep -fconstant-string-class=NSConstantString main.m
main.m: 関数 ‘main’ 内:
main.m:51:2: 警告: no ‘-setValue:forKey:’ method found [デフォルトで有効]
main.m:51:2: 警告: (Messages without a matching method signature [デフォルトで有効]
main.m:51:2: 警告: will be assumed to return ‘id’ and accept [デフォルトで有効]
main.m:51:2: 警告: ‘...’ as arguments.) [デフォルトで有効]
main.m:52:2: 警告: no ‘-valueForKey:’ method found [デフォルトで有効]
gcc -I/usr/include/GNUstep -fconstant-string-class=NSConstantString -o test main.o -lgnustep-base

警告が気になりつつもコンパイルできた。
内容は、methodが無いよ?ということだろうか?
@synthesizeがやってくれているものだと思うのだけど

・とりあえず実行してみる
実行結果

2012-12-27 17:36:24.903 test[6730] hello world

・便利である。