使用@dynamic 在类别中添加@属性 时getter/setter 如何实现

How the getter/setter implement when add a @property in category with @dynamic

我将 属性 添加到我的类别,并在我的类别实现中使用 @dynamic。 看起来效果不错。

@interface aClass (Properties)
@property (nonatomic, readonly) NSString *p;
@end

@implementation aClass (Properties)
@dynamic p;
@end

我知道@dynamic 的意思是告诉编译器不要自动合成 getter 和 setter methods.but 为什么上面的代码可以在没有我的 getter/setter 实现的情况下工作? 它是由运行时提供的吗?

这将编译(和 link,前提是您有一个实际的 @interface@implementation 而不仅仅是一个类别)。但是如果您尝试使用 getter.

它会在运行时崩溃

当您通过 @dynamic 时,您承诺 getter 将在运行时可用(不是 setter;这是 readonly)。如果你尝试在运行时使用 getter,你会发现你的承诺没有实现,你会崩溃并显示 "unrecognized selector" 消息。 @dynamic 说 "trust me." 那么你必须值得信赖。

(请注意 类 应始终以大写字母开头。)


啊,你说的是CALayer。这改变了一切。 CALayer 很神奇。好吧,不是魔法,但绝对是特别的。 CALayer 捕获未处理的选择器并将它们转换为动态属性(我认为将值存储在字典中),就像您所看到的一样。这是一个非常聪明的想法,回到 10.5,我们中的一些人认为这可能是 "new way."(这是 Core Data 工作方式的自然延伸。)我认为 Apple 发现它太聪明了,因为他们还没有'传播给其他类.

实际上,几年前我在 WWDC 上与一些 Apple 开发人员讨论过这个问题。我想知道依赖它是否安全。与我交谈的人没有意识到它在那里,也不推荐它。