设Cobj是引用计数对象的基类。
class CmyObj:public Cobj{
public:
int m_a;
int m_b;
int m_c;
...
};
设现在有一个CmyObj类的对象myObjA,想对其进行复制,则下面方法是错误的:
法1:(错误方法)
CmyObj*myObjB=new CmyObj();
myObjB->autorelease();
*myObjB=*myObjA;
此方法之所以是错误的,是因为我们希望复制出来的myObjB是一个引用计数“干净”的对象(即autorelease对象)。但像上面这样拷贝,myObjA的引用计数也被拷贝给myObjB了,这将导致myObjB在以后的正常使用过程中无法正确释放。
因此正确的做法是:
法2:
CmyObj*myObjB=new CmyObj();
myObjB->autorelease();
myObjB->m_a=myObjA->m_a;
myObjB->m_b=myObjA->m_b;
myObjB->m_c=myObjA->m_c;
....
或者 法3:
CmyObj*myObjB=new CmyObj();
myObjB->autorelease();
*myObjB=*myObjA;
myObjB->m_retainCount=1;//强制将引用计数设为1
法2虽然笨,但总不至于像法1那样既严重内存泄漏又几乎永远都查不出来。
法3虽然理论上可行,但怀疑是否有引擎提倡这种绕过retain/release/autorelease而直接修改引用计数的做法,因为这是极危险的行为。