1

每当我的对象上的属性发生更改或更新时,我都想更改一个变量(随机变量)。这个随机数是基于时间的。因此,每次更新属性时,此 nonce 都会更新为当前时间。

有没有办法自动监听我的对象的所有关键变化?或者我是否必须分别手动维护每个属性的所有键值观察器?

非常感谢

4

2 回答 2

6

你看过 Obj-C 运行时函数吗?请参阅文档中的此处。例如,这为您提供了一个类中所有属性的列表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,您应该是金色的。

于 2013-05-14T15:50:17.633 回答
1

一些想法:

1)您可以向运行时询问属性和 ivars 及其类型,并使用该信息来创建和删除观察者。如果您为一个对象执行此操作,显然需要做很多工作。

2)如果您的属性是“常规的”,即所有强对象,那么您可以使用@dynamic(以防止创建 setter/getter),然后使用resolveInstanceMethod:NSObject 或其他时髦的方法来捕获setMyObject:myObject调用。本质上,您可以执行系统对“set...”调用所做的事情,并动态获取变量的字符串。然后,您可以更新/获取一个 ivar,也许是一个前缀为“-”或其他东西的 ivar,您就可以做您的观察者会做的事情。

3)您可以将所有 ivars 放在“Helper”类中,并将所有设置器指向它(这当然可以向您发送消息),使用forwardingTargetForSelector:. 我在我的一个 github 项目中使用了这种技术(有点)

于 2013-05-14T15:46:02.557 回答