@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
- 在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成,Core Data框架会在运行的时候为此属性生成getter和setter方法
推荐阅读
- 爱就是希望你好好活着
- 烦恼和幸福
- 活着就是生命的全部意义
- 其实你就是个普通人
- 人生是什么(2015.9.8)
- 事件处理程序
- 抑郁症(可怕吗?)
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 甄选句子5.8
- 慢就是快