What is common case for @dynamic usage?
前面有一篇关于@synthesis和@dynamic差异的文章。
我想从通常如何使用@dynamic的角度了解更多关于dynamic的信息。
通常我们将@dynamic与nsmanagedObject一起使用
1 2 3 4 5 6 7 8 9 10
| // Movie.h
@interface Movie : NSManagedObject {
}
@property (retain) NSString* title;
@end
// Movie.m
@implementation Movie
@dynamic title;
@end |
实际上,根据对@dynamic的理解,在编译期间没有生成getter/setter,因此有必要实现自己的getter/setter。
我的问题是,在这个nsmanagedObject案例中,超级类nsmanagedObject中getter/setter的粗略实现是什么?
除了上述情况,还有多少其他情况需要使用@dynamic?
谢谢,
- 正如Justin已经说过的,关键在于@dynamic显式地阻止编译器生成自己的访问器。如果你没有@dynamic(也就是说,如果你什么都没有),那一天"任何事情都可能发生",有不同的版本等等。
@dynamic向编译器表明,即使编译器当前看不到访问器,您也计划为访问器提供自己的实现。如果省略@dynamic,不使用@synthesize,将发生以下两种情况之一:
如果您只提供了一半的访问器(例如,在readwrite属性上没有setter的getter),或者您正在使用gcc,编译器将警告您。
如果使用clang编译代码,将自动为您生成正确的访问器。(synthesis by default is not officially supported.)
因此,@dynamic对于防止编译器执行上述任一操作非常有用。如果您以非常动态的方式实现一个属性(比如运行时函数),这可能也很有用,但这很少是必要的。
- 在哪里可以查看第2点的Clang文档?
- 抱歉,这是他们后来删除的一个实验性功能。合成性质现在需要一个明确的@synthesize。我会更新我的答案。
- 我想你可以恢复到2分。现在,默认情况下会合成属性afaik(另请参见stackoverflow.com/q/11666008/6827)