我有一个问题similar to this one,但我很想知道是否有任何方法(编译器标志,@ -directive等)允许类在编译时将所有可能的属性视为@dynamic,这样你就可以对任何任意属性进行编码,而不必明确地将它声明为@dynamic。
例如,我可以这样做:
myObject.anyPropertyName = someObject;
...非常类似于您可以在JavaScript中执行,而无需声明@dynamic anyPropertyName
。
答案 0 :(得分:4)
你想要的是不可能的。如果之前未声明该选择器,编译器将不允许您发送任何消息。这当然包括访问属性。这是必要的,因此编译器可以知道期望的类型 - 并非所有内容都是对象。编译器必须为对象(想到ARC),结构或标量生成不同的代码。
另一方面,运行时很乐意在没有声明这些属性的情况下处理这个问题。但是,那么你的工作就是将objc_msgSend
的正确变体称为正确的签名。这当然要求代码比直接使用valueForKey:
和setValue:forKey:
更加丑陋。
同样@dynamic
与此无关。所有@dynamic
都会让编译器关闭缺少getter和setter的实现,并阻止它自动生成它们。这是一种向编译器承诺在运行时将要处理这些消息的方法。使用@dynamic不会自动转发对valueForKey:和setValue:forKey的属性访问:。