首页 > 代码库 > 内存管理和@property的属性
内存管理和@property的属性
内存管理和@property的属性
目录
- 对内存管理的理解
- 内存的管理
对象的所有权和内存管理原则
合理解决内存管理带来的问题
自动释放池
- @property的属性
对内存管理的理解
内存的管理
对象的所有权和内存管理原则
一个对象和一个函数都可以拥有对类对象的管理权,因此对象和函数需要负责类对象的创建和释放
合理解决内存管理带来的问题(在MRC下,在dealloc上有对拥有对象做释放)
阶段一
MyClass *myClass = [[MyClass alloc] init];
//myClass的行为
[myClass release];
阶段二
-(void)setEngine:(Engine *)newEngine{ engine = newEngine; }
Car *car = [[Car alloc] init];
Engine *engine = [[Engine alloc] init]; //1
[car setEngine:engine]; //1
[engine release]; //0 致使car对象中的engine指向的对象为空
阶段三
对setter的调整:-(void)setEngine:(Engine *)newEngine{ engine = [newEngine retain]; };
存在问题:
Engine *engine1 = [Engine new]; //1
[car setEngine:engine1]; //2
[engine1 release]; //1
Engine *engine2 = [Engine new]; //1
[car setEngine:engine2]; //1
[car release]; //1 此时engine1没有被释放掉,即car原来指向的对象没有被释放
阶段三
继续对setter的调整:-(void)setEngine:(Engine *)newEngine{ [engine release]; engine = [newEngine retain]; }
存在问题
Engine *engine = [Engine new]; //1
Car *car1 = [Car new];
Car *car2 = [Car new];
[car1 setEngine: engine]; //2
[engine release]; //1
[car2 setEngine:[car1 engine]]; //出错 此时engine的引用计数为0,car1和car2都不能使用其engine属性
阶段四
继续对setter的调整:-(void)setEngine:(Engine *)newEngine{ [newEngine retain]; [engine release]; engine = newEngine; }
自动释放池
@property的属性
内存管理和@property的属性