我在开发一个雄心勃勃的第一个 iPhone 项目时已经走了很远,但我对实现和访问属性的方式以及原因感到困惑。
示例 1: (在.h中)
Nsstring *_sale;
@property (nonatomic, retain) NSString *sale;
(在.m中)
@synthesize sale = _sale;
示例 2: (在.h中)
@property (nonatomic, retain) NSString *sale;
(在.m中)
@synthesize sale;
这两种方法对我来说似乎都没有问题,但我想弄清楚为什么有两种方法可以做到这一点,以及这两种方法可能有什么好处。
有人能告诉我区别吗?
最佳答案
示例 1 演示了定义 ivar/property 变量对的旧方法。新的编译器现在为您生成 ivars(NSstring *_sale;
部分)。示例 1 还演示了使用 @synthesize sale = _sale;
语句手动将属性 sale
与 ivar _sale
配对。
示例 2 是在 Obj-C 中实现属性的更简洁的方式,也是您在 Internet 上看到的大多数示例代码的方式。绝大多数情况下,您可以编写属性而无需覆盖编译器为您生成的访问器/修改器方法。
为了清楚起见,有一些顽固的支持者使用下划线前缀来表示实例变量。您可能会发现这在内存管理方面对您有帮助,如示例 1 所示,将 self.sale
设置为等于自动释放的 NSString 会很好,因为它会被保留,但设置 _sale
等于一个自动释放的对象会在以后导致不稳定的行为,因为传入的 NSString 不会被实例变量保留。
一般来说,我更喜欢像示例 2 中所示那样编写我的属性。
简短回答:有两种方法可以做到这一点,因为新的编译器现在可以为您推断出一些东西,但是为了向后兼容,以前的方法已经被保留了下来。
关于iphone - 在 Xcode 4 和 iOS 4 中定义成员和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5986516/