@property/@dynamic/@synthesize介绍

@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。

你可能感兴趣的:(@property/@dynamic/@synthesize介绍)