您的位置:首页 > 其它

set方法内存分析(2)

2016-01-24 16:36 260 查看
应用场景与上一个分析场景相同,都是人去拥有一辆车,这次的问题是我不是去重新拥有一辆车,而是我去多次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的不是同一个对象的时候,我才把原来的对象的计数器值减一,将原来的对象销毁掉,防止内存泄露
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存