@synthesize的隐含数据成员 - 良好的做​​法或坏习惯?

时间:2011-01-20 22:07:53

标签: objective-c cocoa

今天,我收到了a long list of coding guidelines的链接,宣称是“代码诫命”。很好的阅读,并对我充满了新的见解。在列表中,在滚动条的25%左右,我遇到了一些新内容:创建隐式数据成员。

虽然我读过或看过的关于Objective-C的每本教程,书籍和视频总是执行NSNumber *number | @property NSNumber *number | @synthesize number的三元组,但这些诫命现在告诉我,我可以简单地省略第一步 (接口中的数据成员声明)因为@synthesize将动态创建一个。说什么!?

稍微不相信我删除了几个我的数据成员声明,​​事实上,我的应用仍然像魅力一样。减少打字,减少阅读,减少错别字的机会。

听起来像是一种双赢,但这是不是很好的做法?

我纯粹不相信所有的教程,书籍和视频都在教导错误的教训,至少过多,或者我在课堂上没有注意到......

干杯, EP。

编辑:虽然我从链接的帖子中复制了表达“数据成员”,但它更常用“ivar”这个词来描述,这里只是一个很好的搜索友好性。这也解决了我以前对property / ivar / member命名的困惑:)。

2 个答案:

答案 0 :(得分:6)

合成实例变量是现代Objective-C 2.0运行时的一个特性。这意味着它们可以在x86_64上,ARM上,以及Xcode 3.2上的iPhone模拟器上使用。这意味着你的建议 - 你可以省略ivar声明,@synthesize行将为你生成ivar。其性能与明确声明ivar完全相同,但它具有非常重要的好处,即不会使用私有实现细节污染您的头文件。

答案 1 :(得分:-3)

我已经开始从我创建的Objective-C类中删除合成属性。造成这种情况的主要原因是:

之间存在明显差异
self.myNSObject = [NSObject new];

myNSObject = [NSObject new];

具体来说,如果myNSObject被声明为@property(保留,...),前一行将导致retainCount为2,而后者将导致retainCount为1.这意味着除非你非常小心

您指定的其他原因也非常有效。在我阅读我编写的代码时,我的大脑没有考虑到的综合例程中有很多事情发生了,所以很多事情发生在幕后我没有想到但我还要负责。出于类似的原因,我放弃了Apple的Interface Builder。