@synthesize合成实例变量的规则与使用场景
@interface ViewController2 (){
NSString*_obj1;
}
@property(nonatomic,strong)NSString *obj1;
@end
如果存在一个 _obj1的实例变量,使用@synthesize的规则
@synthesize obj1; //会生成一个obj1 的成员变量 和 _obj1没有关系
@synthesize obj1 = myobj; // 会生成一个 myobj 的成员变量 和 _obj1没有关系
@synthesize obj1 = _obj1; // 不会生成成员变量 直接使用已经存在的_obj1
使用场景
现在都是自动合成属性变量,所以使用@synthesize 应该是在不会自动合成的使用
以下会列出不会自动合成的情况:
1.同事重写了setter和getter时
2.重写了只读的getter方法
3.使用了@dynamic时
4.在@protocol中定义的所有属性
5.在categary中定义的所有属性
6.重载的属性
当你在子类中重载了父类中的属性,你必须 使用 @synthesize 来手动合成ivar。
除了后三条,对其他几个我们可以总结出一个规律:当你想手动管理 @property 的所有内容时,你就会尝试通过实现 @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 来达到这个目的,这时编译器就会认为你打算手动管理 @property,于是编译器就禁用了 autosynthesis(自动合成)。
因为有了 autosynthesis(自动合成),大部分开发者已经习惯不去手动定义ivar,而是依赖于 autosynthesis(自动合成),但是一旦你需要使用ivar,而 autosynthesis(自动合成)又失效了,如果不去手动定义ivar,那么你就得借助 @synthesize 来手动合成 ivar。
其实,@synthesize 语法还有一个应用场景,但是不太建议大家使用:
可以在类的实现代码里通过 @synthesize 语法来指定实例变量的名字:
@implementation CYLPerson
@synthesize firstName = _myFirstName;
@synthesize lastName = _myLastName;
@end
上述语法会将生成的实例变量命名为 _myFirstName 与 _myLastName,而不再使用默认的名字。一般情况下无须修改默认的实例变量名,但是如果你不喜欢以下划线来命名实例变量,那么可以用这个办法将其改为自己想要的名字。还是推荐使用默认的命名方案,因为如果所有人都坚持这套方案,那么写出来的代码大家都能看得懂。
摘自这里