Objective-C中@synthesize两种属性合成写法的区别是什么
Objective-C中两种@synthesize写法的区别与适用场景
核心差异
两种写法的本质区别是编译器自动生成的实例变量(ivar)命名规则不同:
- 写法1:
@synthesize propertyname;
编译器会生成和属性完全同名的实例变量,变量名就是propertyname,没有下划线前缀。 - 写法2:
@synthesize propertyname = _propertyname;
编译器会生成带下划线前缀的实例变量,变量名为_propertyname,和属性名做明确区分。
补充背景:Xcode 4.4版本之后新增了属性自动合成机制,如果你没有手动写
@synthesize,编译器会默认执行@synthesize propertyname = _propertyname;的逻辑,这也是目前iOS开发的通用惯例。
适用场景
选择@synthesize propertyname;的场景
- 老项目兼容维护:Xcode 4.4/iOS SDK 6之前的历史项目,早期OC编码规范没有强制要求实例变量带下划线,很多旧代码都使用和属性同名的实例变量,维护这类项目时需要和原有命名规则保持一致。
- 符合团队特殊规范:如果团队编码规范明确要求实例变量和属性同名、不需要下划线前缀,可以使用这种写法,目前这类规范已经非常少见。
选择@synthesize propertyname = _propertyname;的场景
- 同时手动实现了属性的getter和setter:当你主动重写了某个属性的读写两个方法时,编译器的自动合成机制会失效,需要手动加这句生成符合通用命名习惯的带下划线的实例变量。
- 实现协议中定义的属性:如果你的类遵守了包含property声明的协议,编译器不会自动合成协议中的属性,需要手动写这句完成属性合成。
- 避免命名冲突:带下划线的实例变量可以明确和属性名、局部变量名做区分,避免重名导致的访问逻辑错误,是目前绝大多数项目的首选写法。
内容的提问来源于stack exchange,提问作者stefanosn
相关产品推荐
相关产品推荐

