iPhoneの開発を始めました。 -6ページ目

objective-c カテゴリーでインスタンス変数を宣言して使う。

これでUIViewControllerに NSString* VCStrという物が出来ます。


このソースはretainで使用している為、dealloc時に[self setVCStr: nil];が必要となる
これは忘れそうだな・・。

UIViewControllerにNSString*を追加する

// これをimportする事
#import "objc/runtime.h"

// 型の後にconstを付ける事によってポインターアドレスを変更出来なくする
static NSString* const ViewControllerStringSet = @"VCSTRSet";

@interface ViewController (AddInstance)
@property (nonatomic, retain) NSString* VCStr;
@end

@implementation ViewController (AddInstance)
@dynamic VCStr;
- (void) setVCStr: (NSString*)VCStr
{
objc_setAssociatedObject(self, (const void *)(ViewControllerStringSet), nil, OBJC_ASSOCIATION_RETAIN);
objc_setAssociatedObject(self, (const void *)(ViewControllerStringSet), VCStr, OBJC_ASSOCIATION_RETAIN);
}
- (NSString*) VCStr
{
return objc_getAssociatedObject(self, (const void*)ViewControllerStringSet);
}
@end

objc_setAssociatedObjectについての説明は
http://blog.takeba.me/2009/08/snow-leopardassociated-object.html
ここから参考にしました。
どうやら、オブジェクトとオブジェクトを紐付ける機能らしいです。

引数を見ると(対象、キー、該当オブジェクト、オプション)って感じです。

色々な所から参考にして作成したソースなので分からない所多々あり。

なんでキーを渡す時にconst void*やらないといけないの?



Jackie Evancho - Teaching Angels How to Fly

objc_setAssociatedObject 。。。?ランタイム関数

http://blog.takeba.me/2009/08/snow-leopardassociated-object.html

これをみてまた新しい事が分かりました。

リンクの最後の所が大事ですね。
カテゴリーで元のクラスを拡張したい時に有効そうです。