5

在 iOS (cs193p) 上观看了斯坦福 iTunes U 课程,其中老师明确表示在使用时始终指定 ivar 名称@synthesize以避免出现问题,例如

@synthesize name = _name;

但是在浏览关于声明属性的 Cocoa 文档时,我并没有真正看到这一点,也没有在任何其他示例代码中看到这一点。

这给我带来了一个问题,为什么需要这样做?@synthesize仅使用带有属性名称的 还不够好吗?是否有任何具体问题可以帮助避免?

4

3 回答 3

6

这样做的原因是为了防止 ivars 被直接访问,从而导致内存管理问题。例如:

正确: self.name = newName; 错误:name = newName;

属性的 getter 和 setter 确保正确处理内存管理。要访问 ivars,您必须显式键入前导下划线,这很难偶然做到。直接访问 ivars 的唯一时间是 in initdealloc以及 getter 和 setter。

于 2012-01-09T16:33:29.567 回答
1

如果您不指定 ivar 名称,它将使用与属性相同的名称。所以这两个是等价的:

@synthesize name;
@synthesize name = name;

如果您所做的只是name = name,那么是的,这完全是多余的。

人们指定诸如此类的原因name = _name是为 ivar 和属性使用不同的名称。这样做的一个原因是这样您就不会在属性和 ivar 之间混淆,但坦率地说,如果您不清楚区别,这个小调整不会拯救您。

于 2012-01-09T16:13:09.987 回答
0

它绝对不是多余的,因为它@synthesize name = _name;具有比@synthesize name;. 是否要以不同于属性的方式命名 ivars 在很大程度上取决于个人喜好。两种变体都很好。

于 2012-01-09T15:49:53.647 回答