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

时间:2015-05-28 20:48:20

标签: ios objective-c categories

我在我的类别中添加了一个属性,并在我的类别实现中使用@dynamic。 看起来效果很好。

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

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

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

1 个答案:

答案 0 :(得分:4)

这将编译(和链接,前提是您有一个实际的@implementation@dynamic而不仅仅是一个类别。但是如果你试图使用getter,它会在运行时崩溃。

当你通过readonly时,你承诺getter在运行时可用(而不是setter;这是@dynamic)。如果您尝试在运行时使用getter,您会发现您的承诺未得到满足,并且您将无法识别"无法识别的选择器"信息。 {{1}}说"相信我。"然后你必须值得信赖。

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

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

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