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
・便利である。