Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

KVOと構造体

タグ: Objective-C
#import <Foundation/Foundation.h>

struct Baz
{
	int n;
};

@interface Bar : NSObject
{
	CGAffineTransform transform;
	CGAffineTransform* pointer;
	Baz baz;
}
@property CGAffineTransform transform;
@property CGAffineTransform* pointer;
@property Baz baz;
@end

@implementation Bar
@synthesize transform;
@synthesize pointer;
@synthesize baz;
@end

@interface Foo : NSObject
{
	Bar* bar;
}
@property (readonly) Bar* bar;
@end

@implementation Foo

@synthesize bar;

- (id)init
{
	if(self = [super init])
	{
		bar = [[Bar alloc] init];
		[bar
			addObserver: self
			forKeyPath: @"transform"
			options: NSKeyValueObservingOptionNew
			context: NULL
		];
		[bar
			addObserver: self
			forKeyPath: @"pointer"
			options: NSKeyValueObservingOptionNew
			context: NULL
		];
		[bar
			addObserver: self
			forKeyPath: @"baz"
			options: NSKeyValueObservingOptionNew
			context: NULL
		];
	}
	return self;
}

- (void)dealloc
{
	[bar removeObserver:self forKeyPath:@"baz"];
	[bar removeObserver:self forKeyPath:@"pointer"];
	[bar removeObserver:self forKeyPath:@"transform"];
	[bar release];
	[super dealloc];
}

- (void)observeValueForKeyPath:(NSString*)keyPath
                      ofObject:(id)object
                        change:(NSDictionary*)change
                       context:(void*)context
{
	id value = [change objectForKey:NSKeyValueChangeNewKey];
	NSLog(
		@"%@ %@ %s",
		keyPath, [value class], [value objCType]
	);
}

@end

int main(int argc, const char* argv[])
{
	NSAutoreleasePool* pool =
		[[NSAutoreleasePool alloc] init];
	CGAffineTransform transform = CGAffineTransformIdentity;
	Baz baz;
	Foo* foo = [[Foo alloc] init];
	foo.bar.transform = CGAffineTransformMakeRotation(1);
	foo.bar.pointer = &transform;
	foo.bar.baz = baz;
	[foo release];
	[pool drain];
    return 0;
}

Xcode 3.1.1の実行結果は以下の通り。

transform NSConcreteValue {CGAffineTransform=ffffff}
baz NSConcreteValue  {Baz=i}

やはりポインタは監視できていない
C互換構造体はフレームワーク定義のものもユーザ定義のものも監視できているが、value:withObjCType:のサポートが明言されていないので使って良いかは微妙。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/140-6364052a
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。