在Xcode 4和iOS 4中定义成员和属性

4

我很快就要完成一个相当有雄心的首个iPhone项目,并且我对如何实现和访问属性感到困惑。

示例1: (在.h文件中)

Nsstring *_sale;
@property (nonatomic, retain) NSString *sale;

(在.m文件中)
@synthesize sale = _sale;

示例2: (在.h文件中)
@property (nonatomic, retain) NSString *sale;

(在.m文件中)
@synthesize sale;

在我看来,这两种方法都能顺利运行,但我正在尝试弄清楚为什么有两种方法来完成这个任务,以及每种方法可能带来的好处。

有人能告诉我它们之间的区别吗?


这取决于您想不想通过setter和getter访问ivar(并通过使用_name显式显示它),您可以像示例1那样操作,但通常您会像示例2那样进行操作。 - AndersK
2个回答

4
示例1演示了定义ivar/property变量对的旧方法。新编译器现在为您生成ivars(NSstring *_sale;部分)。示例1还演示了使用@synthesize sale = _sale;语句手动将属性sale与ivar _sale配对的方法。
示例2是一种更简洁的实现Obj-C属性的方式,这也是您在互联网上看到的大多数示例代码的方式。绝大多数情况下,您可以编写属性而无需覆盖编译器为您生成的访问器/修改器方法。
有些人坚定地支持下划线前缀来表示实例变量以提高清晰度。您可能会发现,当涉及到内存管理时,这有助于您,例如在示例1中,将self.sale设置为自动释放的NSString是可以的,因为它会被保留,但是将_sale设置为自动释放对象会导致以后出现不稳定的行为,因为传递的NSString不会被实例变量保留。
总的来说,我更喜欢像示例2中所示的编写属性的方式。
简短回答:有两种方法可以做到这一点,因为新编译器现在可以为您推断一些内容,但是为了向后兼容,以前的做法已经被保留了下来。

@Mr-sk:XCode 4直到2010年才被宣布,而有关代码的这里是记录的使用情况可以追溯到2009年。 - FreeAsInBeer
非常感谢,特别是从内存管理的角度来看。我之前使用过PHP、Java和C#;内存管理是一门有趣而陌生的科学。 - Adam Purdie

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接