是否可以在 Objective-C 中使所有可能的属性都@dynamic?
Is it possible to make all possible properties @dynamic in Objective-C?
我有一个问题 similar to this one,但我很想知道是否有任何方法(编译器标志、@-指令等)可以让 class 考虑所有可能的属性@dynamic 在编译时,这样你就可以针对 any 任意 属性 进行编码,而不必将其显式声明为 @dynamic。
例如我可以这样做:
myObject.anyPropertyName = someObject;
...就像您在 JavaScript 中所做的一样,无需声明 @dynamic anyPropertyName
。
你想要的是不可能的。如果之前没有声明该选择器,编译器将不允许您发送任何消息。这当然包括访问属性。这是必要的,这样编译器就可以知道期望的类型——并不是所有的东西都是对象。编译器必须为对象(想想 ARC)、结构或标量生成不同的代码。
另一方面,运行时很乐意在不声明这些属性的情况下处理这个问题。但是你的工作就是将 objc_msgSend
的正确变体调用为正确的签名。这当然需要比直接使用 valueForKey:
和 setValue:forKey:
更丑陋的代码。
另外 @dynamic
与此无关。 @dynamic
所做的只是让编译器关闭有关缺少 getter 和 setter 实现的信息,并阻止它自动生成它们。这是一种向编译器承诺在运行时将处理这些消息的方法。使用@dynamic 不会自动转发 属性 对 valueForKey: 和 setValue:forKey:.
的访问
我有一个问题 similar to this one,但我很想知道是否有任何方法(编译器标志、@-指令等)可以让 class 考虑所有可能的属性@dynamic 在编译时,这样你就可以针对 any 任意 属性 进行编码,而不必将其显式声明为 @dynamic。
例如我可以这样做:
myObject.anyPropertyName = someObject;
...就像您在 JavaScript 中所做的一样,无需声明 @dynamic anyPropertyName
。
你想要的是不可能的。如果之前没有声明该选择器,编译器将不允许您发送任何消息。这当然包括访问属性。这是必要的,这样编译器就可以知道期望的类型——并不是所有的东西都是对象。编译器必须为对象(想想 ARC)、结构或标量生成不同的代码。
另一方面,运行时很乐意在不声明这些属性的情况下处理这个问题。但是你的工作就是将 objc_msgSend
的正确变体调用为正确的签名。这当然需要比直接使用 valueForKey:
和 setValue:forKey:
更丑陋的代码。
另外 @dynamic
与此无关。 @dynamic
所做的只是让编译器关闭有关缺少 getter 和 setter 实现的信息,并阻止它自动生成它们。这是一种向编译器承诺在运行时将处理这些消息的方法。使用@dynamic 不会自动转发 属性 对 valueForKey: 和 setValue:forKey:.