o c基础,新手。内存管理

intmainfunc1 2018-04-10 07:09:20
问题来自那本很经典的o c学习书,就是那本黑壳青橘的那本objective-c基础教程。
讲的是一个Car类,其内部有一个Engine*engine实例变量,还有一个-(void)setEngine方法;
这里是在讲对象所有权;
这里讲如果编写setEngine方法的第一个版本,结果可能如下:
-(void)setEngine:(Engine*)newEngine
{
engine=[newEngine retain];
}
然后讲这种方法不行,因为在main函数出现以下调用顺序会有问题:
Engine *engine1=[Engine new];
[car setEngine:engine1];
[engine1 release];
Engine *engine2=[Engine new];
[car setEngine:engine2];
说是会出现内存泄漏,main函数已经释放了对engine1对象的引用,但是car类没有释放engine1对象;
于是说另一种尝试能解决这个问题:
-(void)setEngine:(Engine*)newEngine
{
[engine release];
engine=[newEngine retain];
}
为什么这样就可以了?
我想的是一开始car引用engine1的时候内部本来就没有引用任何engine对象,一开始就来[engine release]的作用是什么,如果不起任何作用这样engine1不是一样会内存泄漏吗?
然后书上又讲其实这样的改动不能解决当newEngine和engine对象是同一个对象的时候的情况
举例:
Engine *engine=[Engine new];
Car *car1=[Car new];
Car *car2=[Car new];
[car1 setEngine:engine];
[engine release];
[car2 setEngine:[car1 engine]];
说的是当执行了[engine release]这一步后newEngine和engine都会指向刚释放的内存区,会引发错误。
对于他的举例来说setEngine内部的那句【engine release]中的engine指的是Car类内部的engine还是Engine *engine=[Engine new]里面的engine呢?
...全文
584 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
intmainfunc1 2018-04-10
  • 打赏
  • 举报
回复
引用 楼主 intmainfunc1 的回复:
问题来自那本很经典的o c学习书,就是那本黑壳青橘的那本objective-c基础教程。 讲的是一个Car类,其内部有一个Engine*engine实例变量,还有一个-(void)setEngine方法; 这里是在讲对象所有权; 这里讲如果编写setEngine方法的第一个版本,结果可能如下: -(void)setEngine:(Engine*)newEngine { engine=[newEngine retain]; } 然后讲这种方法不行,因为在main函数出现以下调用顺序会有问题: Engine *engine1=[Engine new]; [car setEngine:engine1]; [engine1 release]; Engine *engine2=[Engine new]; [car setEngine:engine2]; 说是会出现内存泄漏,main函数已经释放了对engine1对象的引用,但是car类没有释放engine1对象; 于是说另一种尝试能解决这个问题: -(void)setEngine:(Engine*)newEngine { [engine release]; engine=[newEngine retain]; } 为什么这样就可以了? 我想的是一开始car引用engine1的时候内部本来就没有引用任何engine对象,一开始就来[engine release]的作用是什么,如果不起任何作用这样engine1不是一样会内存泄漏吗? 然后书上又讲其实这样的改动不能解决当newEngine和engine对象是同一个对象的时候的情况 举例: Engine *engine=[Engine new]; Car *car1=[Car new]; Car *car2=[Car new]; [car1 setEngine:engine]; [engine release]; [car2 setEngine:[car1 engine]]; 说的是当执行了[engine release]这一步后newEngine和engine都会指向刚释放的内存区,会引发错误。 对于他的举例来说setEngine内部的那句【engine release]中的engine指的是Car类内部的engine还是Engine *engine=[Engine new]里面的engine呢?
对于car2来说setEngine语句中的[engine release]有什么意义,只能作用于自己,应该是不能对car1有什么影响吧?怎么会就讲engine对象的保留计数器值归0了呢/
1、这是一个C/C++新手基础教程,合适完全不懂程序的新手入坑,半生不熟的程序入坑,其他语言的程序想学C++。2、这是一个C++基础系列教程,本季是作为基础教程的第一集,主要为学习C语言,为学好C++打好坚实的基础,C++包含了C部分,要学好C++,学好C语言是必然的趋势。3、C++入行系列教程是一个由浅入深的一个过程,第一第二集主要学习C语言和C++,后面三集主要教大家如何用C++去写封装一些商业级案例,。第三集主要学SOCKET编程,了解熟悉socket编程。第四集主要学用C++自定义数据库,纯C++编写 第五集主要学习数据结构,学习C++的各个标准模板库。大家如有兴趣可以学习已经制作完毕的C++游戏服务器和Mysql数据库教程。4、C++入行系列教程不单单是讲解语法知识,还有另外讲解C/C++内存,以及内存优化,工作中经常用到的经验,以及避免一些坑。5、本季教程主要内容是讲解编程语言,计算机组成原理,开发环境,C语言基础语法。普及一些基础知识,并且结合工作经验讲解一些案列。教程后面会安排一些工作任务给学员。具体内容看教程课题大纲6、不保证每个人都学的会,良心之作,不喜勿买。7、教程会结合本人20年工作经验讲解工作经常用到的地方,以及新手入职面试需要注意的地方。打好基础学好C++走遍天下都不怕,相信自己,你行的。8、每一集都是单独的,需要单独购买噢,亲,请看清楚,C++系列每一集 并不是必须购买的。新手朋友第一第二集是必须学购买的哈,千万记得。切记切记切记

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧