@property有两个对应的词,一个是@synthesize,一个是@dynamic。熟悉object-c语法的都知道@synthesize实际的意义就是自动生成属性的setter和getter方法。
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
object-c 为了让开发者习惯使用.的操作,所以可以将接口类中的变量使用@property来声明属性。但是在.h中声明的属性,必须在.m中使用@synthesize或者@dynamic来实现,否则属性不可用。
@dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过编译。其主要的作用就是用在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,core data 框架会在程序运行的时候为此类属性生成getter和setter方法。