Ela*_*hts 7 properties objective-c ios ivar
我有一个我正在编写的应用程序,仅使用@properties.我的任何课程档案中都没有宣布任何一个ivar.据我所知,随着@property的推出,不再需要ivars了.我是按照最佳做法编码的吗?从长远来看,这最终会在众所周知的屁股中咬我吗?我一直在阅读关于"正确"和"错误"的评论......
Cal*_*leb 15
不需要实例变量.只是不需要实例变量声明.给定一个属性和@synthesize语句,编译器将负责创建实例变量以及适当的访问器方法.
独占使用属性没有任何问题.它们简化了内存管理.使用没有属性的iVars也没什么不对,如果那就是你想要的.如果您想使用属性但不想将访问器通告给世界其他地方(即维护封装),请考虑在类扩展中声明非公共属性(实际上是实现文件中的匿名类别).
bbu*_*bum 11
我通常也不会宣布伊娃. 我会经常使用,而且我总是让编译器自动使用@synthesize foo = foo_;以防止直接访问,当我的意思是通过方法,反之亦然._前缀合成ivar (这可以防止意外的直接访问,按照被击中的短语).
并且,正如Caleb所说的那样,仍然有静止的东西,你只是没有明确地声明'em,除非你真的想要(实际上,你没有,因为标题中暴露的ivars对类的客户没用,如果您的API设计得恰当).
我还发现,炒作"只使用init/dealloc中的直接访问,在其他地方使用setter/getter"在很大程度上被夸大了,因此,只需在任何地方使用setter/getter.现实情况是,如果你在初始化/解除分配期间有观察员,你已经被冲洗了; 根据定义,在构造/破坏期间,对象的状态是未定义的,因此,观察者不可能正确地推断该状态.
正如Caleb所指出的,在init/dealloc中使用直接ivar访问的另一个原因是避免实现自定义setter/getter逻辑的子类,这些逻辑可能会因init/dealloc期间对象的未定义状态而变为barf.
虽然这可能是真的,但我认为用自定义行为实现setter/getter是一个令人讨厌的架构缺陷.这样做很脆弱,因此随着时间的推移重构代码变得非常困难.同时,这样的定制行为往往会产生对其他国家的依赖对象中,然后这种依赖导致下令对未在所有被看似简单的反映状态变化的依赖@property声明.
也就是说,如果您的setter和getter被编写为foo.bar = bad;无法在任何时间执行foo,那么您的代码就会被破坏.
| 归档时间: |
|
| 查看次数: |
3131 次 |
| 最近记录: |