@synthesize合成实例变量的规则与使用场景

2018-09-05  本文已影响0人  佟掌柜666

@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,而不再使用默认的名字。一般情况下无须修改默认的实例变量名,但是如果你不喜欢以下划线来命名实例变量,那么可以用这个办法将其改为自己想要的名字。还是推荐使用默认的命名方案,因为如果所有人都坚持这套方案,那么写出来的代码大家都能看得懂。

摘自这里

上一篇下一篇

猜你喜欢

热点阅读