在不到两年前,阅读了Robert McNally谦虚的文章“代码指令:Objective-C编码的最佳实践”之后,我采用了对我的Objective-C类的几乎每个数据成员使用属性的做法( (截至2012年5月的第三条诫命)。McNally列出了这样做的原因(我的重点):
- 属性强制执行访问限制(例如只读)
- 属性强制执行内存管理策略(强,弱)
- 属性提供了透明实现自定义setter和getter的机会。
- 具有自定义setter或getter的属性可用于强制执行线程安全策略。
- 使用单一方法访问实例变量可提高代码的可读性。
我将大多数属性都归为私有类别,因此编号1和4通常不是我遇到的问题。参数3和5更加“柔和”,并且使用正确的工具和其他一致性,它们可能会成为问题。最后,对我而言,这些论点中最具影响力的是数字2,内存管理。从那时起,我一直在这样做。
@property (nonatomic, strong) id object; // Properties became my friends.
在我的最后几个项目中,我转而使用ARC,这使我怀疑为几乎所有内容创建属性仍然是个好主意还是有点多余。ARC为我负责内存管理Objective-C对象的管理,strong
如果您声明ivars ,则对于大多数成员而言,它可以正常工作。无论如何,在ARC之前和之后,您都必须手动管理C类型,并且这些weak
属性大部分是公共属性。
当然,对于需要从类外部访问的任何内容,我仍然使用属性,但是这些属性仅是少数几个属性,而大多数数据成员在实现标头下被列为ivars。
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
作为一个实验,我更加严格地执行了此操作,并且从所有属性移开属性都有一些不错的积极副作用。
- 数据成员代码要求(
@property
/@synthesize
)缩小为ivar声明。 - 我的大部分
self.something
参考资料都整理到_something
。 - 可以轻松地区分哪些数据成员是私有的(无效)和哪些数据成员是公共的(属性)。
- 最后,“感觉”起来更像是苹果打算将其用于房地产的目的,但这是主观的猜测。
关于一个问题:我正在慢慢地向黑暗面发展,使用越来越少的属性来支持实现错误。您能否为我提供一些理由,说明为什么我应该坚持对所有内容都使用属性,或者证实我当前的思路,为什么我应该仅在需要的地方使用更多的ivars和更少的属性?双方最有说服力的答案都会得到我的认可。
编辑:麦克纳利(McNally)在推特上说:“我认为坚持使用房地产的主要理由是:一种做所有事情的方法,那就是做所有事情(包括KVC / KVO)。”