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”?!很大的困惑哦!!搞不懂请知道的朋友指点迷津!
展开
 我来答
a40304
2013-09-14 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:80
采纳率:60%
帮助的人:64.5万
展开全部
楼上辛苦了,不过我觉得他主要纠结的是,为什么engine这个对象已经被释放了,还可以给它赋值。

理由很简单,engine本身不是对象,它只是指向对象的一个指针(通俗地讲就一个对象所在内存位置的标记)。而[engine release ]这句是释放掉的是engine所指向的那个对象,而并非engine(指针)本身。

所以engine还是可以被赋新值的,如果不赋新值,它就是一个空指针而已。

在于你是刚入门,可能有点抽象,我给你打个比方,一个人一个名字(不可重复),那么[engine release
]这条语句就是把这个名为engine的人给灭了,人被灭了,名字还是在的,这时,你说:“engine,给我去买包烟”这时是不会有人回应的,但你说:"给这个新生儿取名叫engine",那当然也是没问题的了,以后你叫可以叫engine帮你买烟了。

呵呵,今天很闲,忍不住又YY了……希望可以帮到你
dayuqi007
2013-09-14 · 超过15用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:27.6万
展开全部
你迷惑的是engine吗,engine本身不是一个对象,它只是一个指针啊。 对象的真身是在内存里占有的一些数据结构。 当[engine release]的时候,有一个潜在的操作是要做的(自己管理内存就是麻烦),就是把engine = nil。其原因是这个指针不需要这个对象了,释放后你就不要再指向它了,因为你释放它你就不知道它还存不存在,可能你会指向一个完全陌生的内存。 那么在这个函数里面,engine指向了新的对象,也就是有新欢了。所以这个函数是内存安全的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式