是否有可能在Objective-C中创建所有可能的属性@dynamic?

时间:2015-03-13 17:58:34

标签: objective-c objective-c-runtime

我有一个问题similar to this one,但我很想知道是否有任何方法(编译器标志,@ -directive等)允许类在编译时将所有可能的属性视为@dynamic,这样你就可以对任何任意属性进行编码,而不必明确地将它声明为@dynamic。

例如,我可以这样做:

myObject.anyPropertyName = someObject;

...非常类似于您可以在JavaScript中执行,而无需声明@dynamic anyPropertyName

1 个答案:

答案 0 :(得分:4)

你想要的是不可能的。如果之前未声明该选择器,编译器将不允许您发送任何消息。这当然包括访问属性。这是必要的,因此编译器可以知道期望的类型 - 并非所有内容都是对象。编译器必须为对象(想到ARC),结构或标量生成不同的代码。

另一方面,运行时很乐意在没有声明这些属性的情况下处理这个问题。但是,那么你的工作就是将objc_msgSend的正确变体称为正确的签名。这当然要求代码比直接使用valueForKey:setValue:forKey:更加丑陋。

同样@dynamic与此无关。所有@dynamic都会让编译器关闭缺少getter和setter的实现,并阻止它自动生成它们。这是一种向编译器承诺在运行时将要处理这些消息的方法。使用@dynamic不会自动转发对valueForKey:和setValue:forKey的属性访问:。