
OC内存管理问题。来大神。 当一个类的成员变量是另一个类的对象指针的时候,如何来写这个成员变量的s
OC内存管理问题。来大神。当一个类的成员变量是另一个类的对象指针的时候,如何来写这个成员变量的setter方法?比如Person类中包含Dog类的对象指针,目前想到最好的...
OC内存管理问题。来大神。
当一个类的成员变量是另一个类的对象指针的时候,如何来写这个成员变量的setter方法?
比如Person类中包含Dog类的对象指针,目前想到最好的是这么写setter方法:{
if(dog != newDog)
{ [dog release]; dog = [newDog retain] } }
然后这么写 dealloc方法:{
[dog release];
NSLog(@"%@ 对象已释放",[self class]);
[super dealloc]; }
但是在main.m中假如先 [person setDog:dog1];
再[person setDog:dog2];
再[person setDog:dog1];
程序会崩溃,原因是dog1在setDog:dog2时已经被销毁或者说释放了,再去setDog:dog1明显不合法。
请问有什么好的代码方法解决这种一个类中的成员变量是对象指针时的内存管理问题么? 展开
当一个类的成员变量是另一个类的对象指针的时候,如何来写这个成员变量的setter方法?
比如Person类中包含Dog类的对象指针,目前想到最好的是这么写setter方法:{
if(dog != newDog)
{ [dog release]; dog = [newDog retain] } }
然后这么写 dealloc方法:{
[dog release];
NSLog(@"%@ 对象已释放",[self class]);
[super dealloc]; }
但是在main.m中假如先 [person setDog:dog1];
再[person setDog:dog2];
再[person setDog:dog1];
程序会崩溃,原因是dog1在setDog:dog2时已经被销毁或者说释放了,再去setDog:dog1明显不合法。
请问有什么好的代码方法解决这种一个类中的成员变量是对象指针时的内存管理问题么? 展开
1个回答
展开全部
怎么会崩呢
Dog * dog1 = [[Dog alloc]init]; // dog1 引用计数为1
[person setDog:dog1]; // dog1 在set方法中retain一次,引用计数为2
[person setDog:dog2]; // dog1被release一次,引用计数为1
[person setDog:dog1]; // dog1引用计数不为0,没有调用Dog的dealloc方法,没有被销毁
不会崩啊
就算当person的实例的引用计数为0了,调用了person的dealloc,在person的dealloc里面,dog被release一次,这时候dog的引用计数才变为1,也不会被dealloc
更多追问追答
追问
[person setDog:dog1];
后面应该有[dog1 release]
同样[person setDog:dog2]; 后面也应该有一条释放dog2的语句对吧,你把这俩语句加上再试试
不然一个dealloc方法发送给对象指针一条release方法怎么释放掉计数器为2的对象的空间
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询