【发布时间】:2013-05-14 15:27:29
【问题描述】:
每当我的对象上的属性发生更改或更新时,我都想更改一个变量(nonce 变量)。这个随机数是基于时间的。因此,每次更新属性时,此 nonce 都会更新为当前时间。
有没有办法自动监听我的对象的所有关键变化?还是我必须分别手动维护每个属性的所有键值观察器?
非常感谢
【问题讨论】:
每当我的对象上的属性发生更改或更新时,我都想更改一个变量(nonce 变量)。这个随机数是基于时间的。因此,每次更新属性时,此 nonce 都会更新为当前时间。
有没有办法自动监听我的对象的所有关键变化?还是我必须分别手动维护每个属性的所有键值观察器?
非常感谢
【问题讨论】:
您看过 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) 您可以向运行时询问属性和 ivars 及其类型,并使用该信息来创建和删除观察者。如果你只为一个对象做这件事,显然需要做很多工作。
2) 如果你的属性是“常规的”,即所有强对象,那么你可以使用@dynamic(防止创建setter/getter),然后使用resolveInstanceMethod: 或其他来自NSObject 的时髦方法来捕获setMyObject: 和myObject 来电。本质上,您可以执行系统为“设置...”调用所做的事情,并动态获取变量的字符串。然后你可以更新/获取一个 ivar,也许是一个前缀为“-”或其他东西的 ivar,你就可以做你的观察者会做的事情。
3) 您可以使用forwardingTargetForSelector: 将所有 ivars 放在“Helper”类中,并将所有设置器指向它(这当然可以向您发送消息)。我在one of my github projects
【讨论】: