我在 iOS (cs193p) 上观看了斯坦福 iTunes U 课程,其中老师明确表示在使用时始终指定 ivar 名称@synthesize
以避免出现问题,例如
@synthesize name = _name;
但是在浏览关于声明属性的 Cocoa 文档时,我并没有真正看到这一点,也没有在任何其他示例代码中看到这一点。
这给我带来了一个问题,为什么需要这样做?@synthesize
仅使用带有属性名称的 还不够好吗?是否有任何具体问题可以帮助避免?
我在 iOS (cs193p) 上观看了斯坦福 iTunes U 课程,其中老师明确表示在使用时始终指定 ivar 名称@synthesize
以避免出现问题,例如
@synthesize name = _name;
但是在浏览关于声明属性的 Cocoa 文档时,我并没有真正看到这一点,也没有在任何其他示例代码中看到这一点。
这给我带来了一个问题,为什么需要这样做?@synthesize
仅使用带有属性名称的 还不够好吗?是否有任何具体问题可以帮助避免?
这样做的原因是为了防止 ivars 被直接访问,从而导致内存管理问题。例如:
正确: self.name = newName;
错误:name = newName;
属性的 getter 和 setter 确保正确处理内存管理。要访问 ivars,您必须显式键入前导下划线,这很难偶然做到。直接访问 ivars 的唯一时间是 in init
,dealloc
以及 getter 和 setter。
如果您不指定 ivar 名称,它将使用与属性相同的名称。所以这两个是等价的:
@synthesize name;
@synthesize name = name;
如果您所做的只是name = name
,那么是的,这完全是多余的。
人们指定诸如此类的原因name = _name
是为 ivar 和属性使用不同的名称。这样做的一个原因是这样您就不会在属性和 ivar 之间混淆,但坦率地说,如果您不清楚区别,这个小调整不会拯救您。
它绝对不是多余的,因为它@synthesize name = _name;
具有比@synthesize name;
. 是否要以不同于属性的方式命名 ivars 在很大程度上取决于个人喜好。两种变体都很好。