每当我的对象上的属性被更改或更新时,我想更改变量(nonce变量)。这个随机数是基于时间的。因此,每次更新属性时,此随机数都会更新为当前时间。
有没有办法自动监听我对象上的所有关键更改?或者我是否必须单独手动维护每个属性的所有keyvalue观察者?
非常感谢
答案 0 :(得分:6)
您是否看过Obj-C运行时函数?请参阅文档中的here。例如,这会为您提供类Lender
中所有属性的列表。 (顺便说一句:我不在我的Mac上,所以这只是文档中的内容):
@interface Lender : NSObject {
float alone;
}
@property float alone;
@end
您可以使用以下方式获取属性列表:
id LenderClass = objc_getClass("Lender");
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
然后您可以获取属性的名称:
const char *property_getName(objc_property_t property)
如果你把这些名字传回addObserver:forKeyPath:options:context
,你应该是金色的。
答案 1 :(得分:1)
一些想法:
1)您可以向运行时询问属性和ivars及其类型,并使用该信息创建和删除观察者。如果你是为一个对象做这件事,显然需要做很多工作。
2)如果你的属性是“常规”,意味着所有强大的对象,那么你可以使用@dynamic(防止setter / getter创建),然后使用resolveInstanceMethod:
或来自NSObject的其他时髦方法来捕获{{ 1}}和setMyObject:
来电。您实质上可以执行系统为“set ...”调用所做的操作,并动态获取变量的字符串。然后你可以更新/获得一个ivar,也许是一个前缀为“ - ”的东西,你可以做你的观察者会做的事情。
3)您可以将所有ivars放入“Helper”类中,并使用myObject
将所有设置者指向它(当然可以向您发送消息)。我在one of my github projects