【问题标题】:Is it possible to make all possible properties @dynamic in Objective-C?是否可以在 Objective-C 中使所有可能的属性 @dynamic ?
【发布时间】:2015-03-13 17:58:33
【问题描述】:

我有一个问题similar to this one,但我很想知道是否有任何方法(编译器标志、@-directive 等)可以让一个类在编译时将所有可能的属性视为@dynamic,例如您可以针对 any 任意属性进行编码,而无需显式将其声明为 @dynamic。

例如我可以这样做:

myObject.anyPropertyName = someObject;

...就像您在 JavaScript 中所做的一样,无需声明 @dynamic anyPropertyName

【问题讨论】:

  • 我不明白你在问什么,这与你链接的问题不同。你能澄清一下吗?
  • 具体来说,我希望我能够使用任何有效的标识符作为点符号属性访问,而不必首先在类上使用 @dynamic 它,并将该调用放入覆盖的 setValue:forKey:类上的方法。
  • iOS 开发学习的“一切都应该是动态的并且总是在运行时”阶段。 :) 看起来很诱人,但是您将失去所有编译器仔细检查类型和逻辑的能力。在实践中,您最好尽可能依靠编译器来审查您的代码,同时在您的应用程序中编写任何类型的专用动态作为算法(可以在代码中验证)。
  • @bbum 为什么你认为我只是在学习 iOS 开发?除了我们作为开发人员从不停止学习这一事实(我有点怀疑你的意思)之外,我觉得你的说法有些居高临下。我很清楚我在走向一个更有活力的系统时会失去什么。在某些情况下,我很乐意用编译时检查来换取动态编程提供的能力。
  • @devios 正如你所说,我们总是在学习。我之所以这么说,是因为在我作为程序员和教师 25 年的 Objective-C 经验中,我还没有遇到一个好奇的开发人员在某些时候没有走这条路;有时在他们开始时,有时在几十年后。这不是冒犯的意思。

标签: objective-c objective-c-runtime


【解决方案1】:

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

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

@dynamic 也与此无关。 @dynamic 所做的只是关闭编译器,因为它缺少 getter 和 setter 的实现,并阻止它自动生成它们。这是一种向编译器保证在运行时将处理这些消息的方法。使用@dynamic 不会自动将属性访问转发到 valueForKey: 和 setValue:forKey:。

【讨论】:

  • 我没想到这是可能的,但我一直在寻找更动态地做事的方法。 ;) 我意识到它不会转发,但它确实允许您将标识符用作属性访问器,而无需在编译时实际定义属性访问器本身,所以我认为这可能是一个小步骤,想知道是否有办法将其作为课程的默认设置。无论如何,谢谢。
猜你喜欢
  • 2011-04-09
  • 2019-02-21
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2022-01-19
  • 2011-11-28
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多