属性

2016-05-19  本文已影响2人  cbd0bfba9942

属性应该尽可能描述性地命名,避免缩写,并且是小写字母开头的驼峰命名。我们的工具可以很方便地帮我们自动补全所有东西(嗯。。几乎所有的,Xcode 的Derived Data 会索引这些命名)。所以没理由少打几个字符了,并且最好尽可能在你源码里表达更多东西。

例子 :

NSString *text;

不要这样 :

NSString* text;
NSString * text;

(注意:这个习惯和常量不同,这是主要从常用和可读性考虑。 C++ 的开发者偏好从变量名中分离类型,作为类型它应该是 NSString* (对于从堆中分配的对象,对于C++是能从栈上分配的)格式。)

使用属性的自动同步 (synthesize) 而不是手动的 @synthesize 语句,除非你的属性是 protocol 的一部分而不是一个完整的类。如果 Xcode 可以自动同步这些变量,就让它来做吧。否则只会让你抛开 Xcode 的优点,维护更冗长的代码。

你应该总是使用 setter 和 getter 方法访问属性,除了 init 和 dealloc 方法。通常,使用属性让你增加了在当前作用域之外的代码块的可能所以可能带来更多副作用。

你总应该用 getter 和 setter ,因为:


使用 setter 会遵守定义的内存管理语义(strong, weak, copy etc...) ,这个在 ARC 之前就是相关的内容。举个例子,copy 属性定义了每个时候你用 setter 并且传送数据的时候,它会复制数据而不用额外的操作。
KVO 通知(willChangeValueForKey, didChangeValueForKey) 会被自动执行。
更容易debug:你可以设置一个断点在属性声明上并且断点会在每次 getter / setter 方法调用的时候执行,或者你可以在自己的自定义 setter/getter 设置断点。
允许在一个单独的地方为设置值添加额外的逻辑。


你应该倾向于用 getter:


它是对未来的变化有扩展能力的(比如,属性是自动生成的)。
它允许子类化。
更简单的debug(比如,允许拿出一个断点在 getter 方法里面,并且看谁访问了特别的 getter
它让意图更加清晰和明确:通过访问 ivar _anIvar 你可以明确的访问 self->_anIvar.这可能导致问题。在 block 里面访问 ivar (你捕捉并且 retain 了 self,即使你没有明确的看到 self 关键词)。
它自动产生KVO 通知。
在消息发送的时候增加的开销是微不足道的。更多关于性能问题的介绍你可以看 Should I Use a Property or an Instance Variable?。


上一篇下一篇

猜你喜欢

热点阅读