@dynamic

@dynamic 就是告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。

// 不自动生成getter/setter方法,不合成成员变量(不可使用_var方式访问属性) @dynmic var; // 语法错误,不允许这么定义 @dynmic var = _var;



假如一个属性被声明为 @dynamic foo,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到 instance.foo = someFoo,由于缺 setter 方法会导致程序崩溃;或者当运行到 someFoo = foo 时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。


应用于场景:
1.当重写父类的属性的时候,如果不加@dynamic name; 编译器会在student类中name属性行报警告:
Auto property synthesis will not synthesize property 'name'; it will be implemented by its superclass, use @dynamic to acknowledge intention
【@dynamic】父类:
@interface person : NSObject @property (nonatomic, strong) NSString *name; @end

子类:
@interface student : person @property (nonatomic, strong) NSString *name; @end @implementation student @dynamic name; @end

  1. 在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成,Core Data框架会在运行的时候为此属性生成getter和setter方法

    推荐阅读