为assig
对于在引用计数下的对象特性,只创建了一个弱引用(也就是平时说的浅复制)。这样使用变量会很危险。当你release了前一个对象的时候,被赋值的对象指针就成了无头指针了。因此在为对象类型的变量声明属性的时候,尽量少(或者不要)使用assig
。
f关于assig
合成的setter,看起来是这样的:voidsetObjAClassAaobjAa
在深入retai
之前,先把声明为retai
特性的setter写出来:voidsetObjAClassAaIfobjAaobjAreleaseobjAaobjAretai
对象的retai
cou
t加1明显的,在retai
的setter中,变量retai
了一次,那么,即使你在程序中selfobjAa只写了这么一句,objA仍然需要release,才能保证对象的retai
cou
t是正确的。但是如果你的代码objAa;只写了这么一句,那么这里只是进行了一次浅复制,对象的retai
cou
t并没有增加,因此这样写的话,你不需要在后面releaseobjA。这2句话的区别是,第一句使用了编译器生成的setter来设置objA的值,而第二句只是一个简单的指针赋值。
copy的setter看起来是这样的
voidsetObjAClassAaClassAtempobjA
fobjAa
copyWithZo
e
il
temprelease复制必须通过实现copyWithZo
e:这个方法,因次copy这个特性只适用于拥有这个方法的类型,也就是说,必须这个类支持复制。复制是把原来的对象release掉,然后让指针指向一个新的对象的副本。因此即使在setter里面release了原来的对象,你仍然需要在后面release新指向的对象(副本)。
六、尾声IOS开发现在唯一能用的内存管理方式就是引用计数,无论你喜欢还是不喜欢。在一个内存紧缺的机器上,你编写程序的时候也只能步步为营,尽可能的让你的程序腾出内存空间,并保证系统不会给你一个警告。即使苹果在MacOSX雪豹v105系统里面添加了另外一种内存管理方式垃圾收集,但目前不适用于IOS。
fr