我们一直在使用KVO来跟踪对象中的一些变化。最近我们将代码更改为c ++,将其放入多平台库中。
这给我们留下了一些属性,这些属性现在是指向c ++对象的指针,但是同样的推理也适用于void *
,或任何指向什么不是真正的Objective-C对象的指针。
基本上我们有
@property (nonatomic) void *value;
出现了一些问题:
这可以通过手动实施setter来处理,即
-(void)setValue:(void *)value {
[self willChangeValueForKey:@"value"];
_value = value;
[self didChangeValueForKey:@"value"];
}
这似乎很自然,因为它不清楚如何将自定义数据放入某些对象传递。这会破坏在更改字典中请求旧数据或新数据的观察者。再一次,人们可以在这里帮助自己并手动包装:
-(id)valueForKey:(NSString *)key {
if ([key isEqualToString:@"value"])
return [NSValue valueWithPointer:_value];
return [super valueForKey:key];
}
因此,我已经解决了一些故障,我想知道是否还有更多陷阱需要注意。或者在这方面有一些最佳做法吗?