objective-c内存管理问题
-(void)setEngine:(Engine*)newEngine{[newEngineretain];[enginerelease];engine=newEngi...
-(void)setEngine:(Engine*)newEngine
{
[newEngine retain];
[engine release ];
engine=newEngine;
}
本人刚学objective-c,有个内存管理的问题困扰
以上方法中 [engine release ]已经把“engine”对象释放掉了,怎么后面“engine=newEngine;” 还可以有engine对象呢?把一个存在的“newEngine”对象赋给一个释放掉的对象“engine”?!很大的困惑哦!!搞不懂请知道的朋友指点迷津! 展开
{
[newEngine retain];
[engine release ];
engine=newEngine;
}
本人刚学objective-c,有个内存管理的问题困扰
以上方法中 [engine release ]已经把“engine”对象释放掉了,怎么后面“engine=newEngine;” 还可以有engine对象呢?把一个存在的“newEngine”对象赋给一个释放掉的对象“engine”?!很大的困惑哦!!搞不懂请知道的朋友指点迷津! 展开
展开全部
楼上辛苦了,不过我觉得他主要纠结的是,为什么engine这个对象已经被释放了,还可以给它赋值。
理由很简单,engine本身不是对象,它只是指向对象的一个指针(通俗地讲就一个对象所在内存位置的标记)。而[engine release ]这句是释放掉的是engine所指向的那个对象,而并非engine(指针)本身。
所以engine还是可以被赋新值的,如果不赋新值,它就是一个空指针而已。
在于你是刚入门,可能有点抽象,我给你打个比方,一个人一个名字(不可重复),那么[engine release
]这条语句就是把这个名为engine的人给灭了,人被灭了,名字还是在的,这时,你说:“engine,给我去买包烟”这时是不会有人回应的,但你说:"给这个新生儿取名叫engine",那当然也是没问题的了,以后你叫可以叫engine帮你买烟了。
呵呵,今天很闲,忍不住又YY了……希望可以帮到你
理由很简单,engine本身不是对象,它只是指向对象的一个指针(通俗地讲就一个对象所在内存位置的标记)。而[engine release ]这句是释放掉的是engine所指向的那个对象,而并非engine(指针)本身。
所以engine还是可以被赋新值的,如果不赋新值,它就是一个空指针而已。
在于你是刚入门,可能有点抽象,我给你打个比方,一个人一个名字(不可重复),那么[engine release
]这条语句就是把这个名为engine的人给灭了,人被灭了,名字还是在的,这时,你说:“engine,给我去买包烟”这时是不会有人回应的,但你说:"给这个新生儿取名叫engine",那当然也是没问题的了,以后你叫可以叫engine帮你买烟了。
呵呵,今天很闲,忍不住又YY了……希望可以帮到你
展开全部
你迷惑的是engine吗,engine本身不是一个对象,它只是一个指针啊。 对象的真身是在内存里占有的一些数据结构。 当[engine release]的时候,有一个潜在的操作是要做的(自己管理内存就是麻烦),就是把engine = nil。其原因是这个指针不需要这个对象了,释放后你就不要再指向它了,因为你释放它你就不知道它还存不存在,可能你会指向一个完全陌生的内存。 那么在这个函数里面,engine指向了新的对象,也就是有新欢了。所以这个函数是内存安全的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询