4

之前有一篇关于@synthesize 和@dynamic 的区别的帖子。

我想从通常如何使用@dynamic 的角度了解更多关于动态的信息。

通常我们将@dynamic 与 NSManagedObject 一起使用

// 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 ?

谢谢,

4

1 回答 1

4

@dynamic向编译器表明您计划为访问器提供自己的实现,即使编译器当前看不到它们。如果您省略@dynamic并且不使用@synthesize,则会发生以下两种情况之一:

  1. 如果您只提供了一半的访问器(例如,在readwrite属性上没有设置器的 getter),或者您正在使用 GCC,编译器会警告您。
  2. 如果您使用 Clang 编译代码,则会自动为您生成正确的访问器。(官方不支持默认合成。)

@dynamic因此对于防止编译器执行上述任一操作很有用。如果您以非常动态的方式(例如使用运行时函数)实现属性,这也可能会派上用场,但这很少需要。

于 2010-12-24T07:48:21.070 回答