0x00 引用自 禅与 Objective-C 编程艺术 与刘亚芳博客
0x01 什么是setter和getter
在OC里, 为实例变量赋值的方法称作setter(设置器)
读取实例变量值的方法称作getter(访问器)
0x02 setter 和 getter的书写格式
OC里规定里setter和getter的书写格式
如果一个实例变量是 int age;或者int_age;
setter的书写格式如下
- (void)setAge:(int)age;
即set+首字母大写的实例变量名(忽略下划线)
getter的书写格式如下,
-(int)age;
即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
0x03 setter和getter与实例变量的关系
无论setter还是getter内部操作的是实例变量
每一个实例变量都需要一对setter和getter方法
0x04 setter和getter的好处
你应该总是使用 setter 和 getter 方法访问属性,除了init和dealloc方法。通常,使用属性让你增加了在当前作用域之外的代码块的可能所以可能带来更多副作用
你总应该用 getter 和 setter 因为:
使用 setter 会遵守定义的内存管理语义(strong,weak,copyetc...) 这回定义更多相关的在ARC是钱,因为它始终是相关的。举个例子,copy每个时候你用 setter 并且传送数据的时候,它会复制数据而不用额外的操作
KVO 通知(willChangeValueForKey,didChangeValueForKey) 会被自动执行
更容易debug:你可以设置一个断点在属性声明上并且断点会在每次 getter / setter 方法调用的时候执行,或者你可以在自己的自定义 setter/getter 设置断点。
允许在一个单独的地方为设置值添加额外的逻辑。
你应该倾向于用 getter:
它是对未来的变化有扩展能力的(比如,属性是自动生成的)
它允许子类化
更简单的debug(比如,允许拿出一个断点在 getter 方法里面,并且看谁访问了特别的 getter
它让意图更加清晰和明确:通过访问 ivar_anIvar你可以明确的访问self->_anIvar.这可能导致问题。在 block 里面访问 ivar (你捕捉并且 retain 了 sefl 即使你没有明确的看到 self 关键词)
它自动产生KVO 通知
0x05 Warning 不要在Init和dealloc中使用 getter和setter
你永远不能在 init (以及其他初始化函数)里面用 getter 和 setter 方法,并且你直接访问实例变量。事实上一个子类可以重载sette或者getter并且尝试调用其他方法,访问属性的或者 ivar 的话,他们可能没有完全初始化。记住一个对象是仅仅在 init 返回的时候,才会被认为是初始化完成到一个状态了。同样在 dealloc 方法中(在 dealloc 方法中,一个对象可以在一个 不确定的状态中)这是同样需要被注意的。
网友评论