属性和实例变量的最佳实践

属性应该表示对象的状态,获取方法不应该有外部副作用

避免直接使用实例变量,要用存取器。
因为ARC会自动管理保留和释放,有些开发者会认为这条规则不重要了,但是还有其他原因要要用存取器。

什么时候要用存取器
  • 键值观察 ------使用存取器最重要的原因可能是属性会被观察,如果不用存取器,开发者可能需要在每次修改属性的实例变量时调用willChangeValueForKey:和didChangeValueForKey:。存取器会自动调用这些方法。

  • 副作用 ------开发者自身或者某个子类会在设置方法中引入副作用,可能是发出通知或者在NSUndoManager中注册了事件,除非必要,不要绕开这些副作用。类似地,开发者或者子类可能会在获取方法中增加缓存。而直接访问实例变量会绕过缓存。

  • 惰性初始化 -------如果属性是惰性初始化,必须用存取器使其正确释放。

  • 锁 -----如果为属性引入锁来管理多线程代码,直接访问实例变量会破坏锁并可能使程序崩溃。

  • 一致性 -----有的人可能会说,只有我们在基于前面提到的原因而需要用存取器时才用存取器。但是这样会让代码难以维护,更好的做法是怀疑每次实例变量的直接访问并解释原因,而不是一直记得那些实例变量需要用存取器那些不需要。

什么时候不要用存取器
  • 在存取器内部 。显然,在存取器的内部不能用存取器本身。一般来说,也不要在获取方法中使用设置方法(有些情况会发生死循环)。存取器应该访问自己的实例变量。

  • dealloc ARC极大减少了需要写dealloc的地方,不过有时候,还是会用到。最好不要在dealloc中调用外部对象。对象可能处于不一致的状态,而且观察者收到属性变化的多个通知也可能会迷惑,而实际上真实含义是对象正在销毁。

  • 初始化 类似于dealloc,在初始化过程中,对象可能处于不一致状态,在这个阶段一般不应该触发通知或者有别的副作用。这里通常是初始化只读变量的地方,比如NSMutableArray.这样能避免把属性声明为readwrite,从而只有开发者本人能进行初始化。

你可能感兴趣的:(属性和实例变量的最佳实践)