set方法内存分析(2)
2016-01-24 16:36
260 查看
应用场景与上一个分析场景相同,都是人去拥有一辆车,这次的问题是我不是去重新拥有一辆车,而是我去多次set同一辆车的时候,会存在一些问题,如:
上面的方法导致的问题就是对象会被提前释放掉,因此:对person类中的set方法进行修改后:
说明:只有当set的不是同一个对象的时候,我才把原来的对象的计数器值减一,将原来的对象销毁掉,防止内存泄露
#import <Foundation/Foundation.h> #import "person.h" int main(int argc, const char * argv[]) { @autoreleasepool { person *p = [[person alloc]init]; car *c1 = [[car alloc]init]; [p setCar:c1];//c1的引用计数器值为1,第一次执行set方法,执行完以后计数器值变为2 [p driver]; [c1 release];//执行release操作,c1的计数器值减为1 [p setCar:c1]; [p driver]; [p release]; } return 0; }
#import <Foundation/Foundation.h> #import "car.h" @interface person : NSObject { car *_car; } - (void)setCar:(car *)car; - (car *)car; - (void)driver; @end
#import "person.h" @implementation person - (void)setCar:(car *)car{ [_car release];//第一次set不会对计数器值进行操作,第二次set的时候,会执行release操作,计数器值减为0 ,调用car的dealloc方法,释放对象,car被提前释放 _car = [car retain];//第一次set的时候,引用计数器值为2 } - (car *)car { return _car; } - (void)driver { [_car run]; } - (void)dealloc { [_car release]; [super dealloc]; NSLog(@"人被销毁了"); } @end
#import "car.h" @implementation car - (void)run { NSLog(@"车跑起来了"); } - (void)dealloc { [super dealloc]; NSLog(@"CAR被销毁了"); } @end
上面的方法导致的问题就是对象会被提前释放掉,因此:对person类中的set方法进行修改后:
#import "person.h" @implementation person - (void)setCar:(car *)car{ //这样做的目的是防止对象被提前释放掉,只有不同对象被set的时候,才将原来的对象进行一次release操作 if (_car != car) { [_car release]; _car = [car retain]; } } - (car *)car { return _car; } - (void)driver { [_car run]; } - (void)dealloc { [_car release]; [super dealloc]; NSLog(@"人被销毁了"); } @end
说明:只有当set的不是同一个对象的时候,我才把原来的对象的计数器值减一,将原来的对象销毁掉,防止内存泄露
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- J2ME编程中的几个重要概念介绍
- c++实现逐行读取配置文件写入内存的示例
- Shell脚本查看进程内存真实占用情况
- w3wp.exe占用cpu过高的解决方法第1/2页