@property/@dynamic/@synthesize介绍
2019-09-27 本文已影响0人
摩卡奇
@property = ivar + getter + setter
一定要区分开属性(property)和实例变量(ivar)
使用@property将会
- 自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis)
- 编译器还会自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,作为实例变量的名字。
@synthesize
可以使用@synthesize语法指定实例变量的名字
@implementation Person
@synthesize firstName = _firstName;
@synthesize lastName = _lastName;
@end
@dynamic
这个关键字会告诉编译器,不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。而且,在编译访问属性的代码时,即使编译器发现没有定义存取方法,也不会报错,它相信这些方法能在运行期找到。
举栗子:
在CoreData框架中的NSManagedObject类里继承了一个子类,那么就需要在运行期动态创建存取方法。继承NSManagedObject时之所以这么做,是因为子类的某些属性不是实例变量,其数据来自后段的数据库中。
@interface Person: NSManagedObject
@property NSString *firstName;
@property NSString *lastName;
@end
@implementation Person
@dynamic firstName, lastName;
@end
一些备注👉
当我们重写了一个属性的getter和setter方法之后,不做其他处理报错?
我们一般使用这个方法@synthesize var = _var
去除报错,这句话主要是帮你实现了ivar(当然也会选择性的生成getter和setter方法)。这种情况下你已经实现了这个变量的getter和setter方法,使用@synthesize有点违背当初的设计。按照苹果官方的标准最好使用@dynamic,然后自己生命实例变量,自己实现getter和setter方法。
而且在@synthesize相对于@dynamic,就是让你动态的实现一个属性的访问方法和ivar,如果你想完全接管property,最好用@dynamic修饰@property。