@property你们都知道可以根据给定的内存管理语意以及原子性和非原子性的设置自动合成对应的setter和getter方法。可是@property具体在背后除此以外还干了什么就不必定了解了。而因为这些不了解所带来的开发中的困惑和卡顿也尤其使人不快,笔者在写这篇博客的时候也遇到了一样的这些问题,如今查明这些疑难杂症,将其一一破解。程序员
@property的发展历程经历两个阶段,当@property语法糖刚被引入进Objc时,@property是做为生成set和get方法的语法糖而存在的,仅在.h文件中自动生成accessor的方法声明,程序员仍是要写出实例变量,配合@synthesize来指出要合成存取方法的变量。第二个阶段是,@property变得更加的自动化,除生成accessor方法外,还能够直接完成之前@synthesize的功能,而且生成实例变量。objective-c
可是这引起了一些困惑,这些困惑苹果的官方文档说的也不甚清楚。继承
由编译器合成的实例变量的继承范围可见性是什么?内存
对于继承父类中声明为@protected和@private的变量而言,在子类中访问这些变量会被明确告知变量是private的,没法访问。可是对于在子类中用_iva的方式访问父类自动合成出来的实例变量,只是简单的提示变量不存在。因此对于合成出来的实例变量是无法肯定其继承范围的,子类在继承父类时,只能经过访问accessor方法来访问这些实例变量。开发
编译器将这些实例变量合成在哪里呢?文档
精确的位置并无查到,可是肯定的是合成在出现@synthesize的文件,也就是.m文件中,对于在@implementation synthesize的变量和多是做为类的私有变量声明在.m文件中了。get
要注意的问题:编译器
当你复写了get和set方法以后@synthesize就不会起做用了,这也就意味着你的类不会自动生成出来的实例变量了。你若是要复写set get方法你就必需要本身声明实例变量。博客
参考资料:it