Property和实例变量(Ivar)的最佳实践
2016-04-29 16:53
281 查看
http://blog.sina.com.cn/s/blog_af73e7a70102uwmf.html
Property应该代表一个对象的状态,Getter应该没有外部影响(它们可以具有内部影响,例如caching,但那些应该是调用者不可见的)。
避免直接访问实例变量,使用accessor来代替。
在早期的ARC里,引起bug最常见的原因就是直接访问实例变量。开发者没有正确的retain和release实例变量,它们的应用就会崩溃或者内存泄露。由于ARC自动管理retain和release,一些开发者认为这个规则已经不再重要,但仍还有其他使用accessors的原因:
* KVO
也许使用accessor的最关键原因是,property可以被观察到。如果你不使用accessor,你需要在每次修改property里的实例变量时调用willChangeValueForKey: 和 didChangeValueForKey: ,而accessor会在需要时自动调用这些方法。
* Side effects
在setter里,你或者你的子类可能包含side effects。通知可能被传送、事件可能被注册到NSUndoManager里,你不应该绕过这些side effects,除非它是必要的。
* Lazy instantiation
如果一个property被lazily instantiated,必须使用accessor来确保它的正确初始化。
* Locking
如果引进locking到一个property里来管理多线程代码,直接访问实例变量将违背你的lock,并可能导致程序崩溃。
* Consistency
在看到前面的内容后,有人可能会说应该只使用accessor,但这使得代码很难维护。怀疑和解释每一个直接访问的实例变量,而不是记住哪些需要accessor哪些不需要,这样使得代码更容易审核、审阅和维护。Accessor,特别是synthesized accessors,已经在OC里被高度优化,它们值得使用。
这就是说,你不应该在这几个地方使用accessor:
* Accessor内部
显然,你不能在accessor内部使用自身。通常,你也不想在getter和setter内部使用它们自己(这可能创建无限循环),一个accessor应该访问其自身的实例变量。
* Dealloc
ARC极大地减少了dealloc,但它有时仍会出现。最好调用dealloc里的外部对象,该对象可能处于不一致的状态,并很可能造成混淆。
* Initialization
类似dealloc,对象可能在初始化过程中处于不一致状态,你不应该在此时销毁通知或者其他的side effects。
Property应该代表一个对象的状态,Getter应该没有外部影响(它们可以具有内部影响,例如caching,但那些应该是调用者不可见的)。
避免直接访问实例变量,使用accessor来代替。
在早期的ARC里,引起bug最常见的原因就是直接访问实例变量。开发者没有正确的retain和release实例变量,它们的应用就会崩溃或者内存泄露。由于ARC自动管理retain和release,一些开发者认为这个规则已经不再重要,但仍还有其他使用accessors的原因:
* KVO
也许使用accessor的最关键原因是,property可以被观察到。如果你不使用accessor,你需要在每次修改property里的实例变量时调用willChangeValueForKey: 和 didChangeValueForKey: ,而accessor会在需要时自动调用这些方法。
* Side effects
在setter里,你或者你的子类可能包含side effects。通知可能被传送、事件可能被注册到NSUndoManager里,你不应该绕过这些side effects,除非它是必要的。
* Lazy instantiation
如果一个property被lazily instantiated,必须使用accessor来确保它的正确初始化。
* Locking
如果引进locking到一个property里来管理多线程代码,直接访问实例变量将违背你的lock,并可能导致程序崩溃。
* Consistency
在看到前面的内容后,有人可能会说应该只使用accessor,但这使得代码很难维护。怀疑和解释每一个直接访问的实例变量,而不是记住哪些需要accessor哪些不需要,这样使得代码更容易审核、审阅和维护。Accessor,特别是synthesized accessors,已经在OC里被高度优化,它们值得使用。
这就是说,你不应该在这几个地方使用accessor:
* Accessor内部
显然,你不能在accessor内部使用自身。通常,你也不想在getter和setter内部使用它们自己(这可能创建无限循环),一个accessor应该访问其自身的实例变量。
* Dealloc
ARC极大地减少了dealloc,但它有时仍会出现。最好调用dealloc里的外部对象,该对象可能处于不一致的状态,并很可能造成混淆。
* Initialization
类似dealloc,对象可能在初始化过程中处于不一致状态,你不应该在此时销毁通知或者其他的side effects。
相关文章推荐
- Linux内核分析学习总结
- centos6.5环境基于conga的web图形化界面方式配置rhcs集群
- 在ArchLinux上安装单机版本kafka
- paypal支付 paypal网站付款标准版问题解决
- centos6.5环境基于conga的web图形化界面方式配置rhcs集群
- ecshop 后台 审核功能
- Linux下编写程序
- 为什么要把网站的URL做成伪静态?
- opencv异常集锦 之 自定义ROI出现图像移位
- 单点登录系统构建之二——SSO原理及CAS架构
- nginx 负载均衡服务器的双机搞可用
- nginx怎么限制客户端访问频次与访问次数
- 高级字符驱动程序操作(Linux设备驱动程序)
- 架构模式
- nginx设置目录文档访问权限
- apache.commons.lang.StringUtils 使用心得
- 7.Linux swap分区的使用,主引导记录(MBR)的备份、dd,df,du命令的使用
- Linux下端口被占用解决
- linux 搭建jenkins+创建maven工程JOB
- nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)