KVOを使用してObjective-Cクラスのユニオン型のプロパティを観察する必要がありますが、これではうまくいかないようです。私はいくつかの実験を行いました。C構造体を使用している限り、すべてが正常に機能します。構造体をユニオンに置き換えるとすぐに、自動KVOは機能しなくなります(observeValueForKeyPath
呼び出されません)。
これが私の小さなテストクラスです:
AppDelegate.h:
#import <Cocoa/Cocoa.h>
typedef union {
float data[3];
struct {
float x,y,z;
};
} vec3union;
typedef struct {
float x,y,z;
} vec3struct;
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (assign) vec3struct vectorStructValue;
@property (assign) vec3union vectorUnionValue;
@end
AppDelegate.m:
@implementation AppDelegate
@synthesize vectorStructValue = _vectorStructValue;
@synthesize vectorUnionValue = _vectorUnionValue;
- (void)dealloc
{
[super dealloc];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self addObserver:self forKeyPath:@"vectorStructValue" options:NSKeyValueObservingOptionNew context:nil];
[self addObserver:self forKeyPath:@"vectorUnionValue" options:NSKeyValueObservingOptionNew context:nil];
self.vectorStructValue = (vec3struct){1,2,3};
self.vectorUnionValue = (vec3union){4,5,6};
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath %@ did change, object: %@", keyPath, [object description]);
}
@end
出力:
2013-01-12 17:38:26.447 KVOTest[57522:303] keyPath vectorStructValue did change, object: <AppDelegate: 0x100614200>
私は何か間違ったことをしていますか、それともこれはObjective-Cランタイム/ KVO実装のバグまたは欠落している機能ですか?
注:プロパティセッターをオーバーライドすることでこれを手動で実装できることはわかっていますが、これはこの質問のポイントではありません。答えは、この場合に自動KVOが機能しない理由を私に教えてくれるはずです。
更新:これを明確にするために、これはstructプロパティのKVOオブザーバーをunionプロパティのKVOオブザーバーと比較する単純なテストケースです。これらのプロパティは相互に関連していません。それらには、独立したメモリバッキングストアを備えた独立したivarがあります。structプロパティを削除してテストを実行できますが、それでも同じ結果になります。unionプロパティのKVOオブザーバーイベントはありません。