Die*_*ego 56 properties objective-c instance-variables ios
我看到它在为iOS编码时建议应该使用属性来访问实例变量,因为这会给内存管理带来诸多好处.
这个建议并不适合我.我发现使用属性而不是普通的旧ivars只需要太多的代码,如果你对内存管理感到满意,我并没有真正看到它的好处.它真的那么重要吗?您管理实例变量的方法是什么?
Dan*_*son 78
没有必要为所有ivars声明属性.想到几点:
init
,然后在必要时释放dealloc
.所以我通常使用属性,但是对于像NSMutableArray
对象分配的那些东西init
并用于容纳一堆whatevers,我将使用一个普通的旧ivar,因为我永远不会重新分配ivar.
bbu*_*bum 51
虽然丹尼尔的答案是正确的,但我认为它错过了一个重要的观点.即:
我发现使用属性而不是普通的旧ivars只需要太多的代码,如果你对内存管理感到满意,我并没有真正看到它的好处.
好处是一致性; 一致的内存管理和一致的行为.
值得注意的是,这两行代码在运行时实际上可能具有极其不同的行为:
iVar = [foo retain];
self.iVar = foo;
Run Code Online (Sandbox Code Playgroud)
第一个是实例变量的直接设置,不会有更改通知.第二个遍历setter,因此,在设置时保留任何子类自定义,并确保向属性的任何观察者通知更改.
如果您在整个代码中直接使用ivars(在类的内部 - 如果您直接从该实例外部使用实例的ivars,那么......任何在您的代码库上工作的承包商应该加倍他们的费率;),那么你必须或者也可以手动处理更改通知传播(通常通过调用willChangeValueForKey:
/ didChangeValueForKey
)或明确设计应用程序以避免使用依赖于键值观察的机制.
你说"需要太多代码".我没有看到; 在上面两行代码中,点语法是较少的字符.即使使用传统语法调用setter方法也会减少代码.
并且不要忽视集中内存管理的价值; 在无数的呼叫站点和崩溃的城市中发生了一次意外遗漏.