内存管理的原则 1)原则 只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1; 2)谁创建,谁release (1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法
(2)不是你创建的就不用你去负责 3)谁retain,谁release 只要你调用了retain,无论这个对象时如何生成的,你都要调用release 4)总结 有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1. 内存管理研究内容 1)野指针(僵尸对象) 2)内存泄露
以上是关于内存管理的简单介绍,下面介绍几个关键字的介绍首先是 set:set方法存在的问题 1) set方法写法(一) 原对象无法释放造成的内存泄露-(void)setCar:(Car*)car{ _car = [car retain]; } 2) set方法写法(二) 原对象能够释放,但是引起新的问题,set自己的时候,造成的野指针 -(void)setCar:(Car*)car{
[_car release];//先释放上一个对象,(注意第一次是向nil发送release消息) _car = [car retain]; }
Person *person = [Person new];// person 1 Car *car1 = [Car new]; //car1 1 car1.speed = 100; //把car1给person
[person setCar:car1]; //car1 2 //开车
[person driver]; [car1release]; //car1 1 //重复设置car1 car1.speed = 220; [person setCar:car1];
3) set方法写法(三) 解决上述问题: 判断新传递的对象是否是原来的对象,如果不是原来的对象则释放,然后再retain -(void)setCar:(Car*)car{
//判断_car 存放的是否是 形参对象,如果不是,则执行 [_car realease]; if (_car!=car) { [_car release];//先释放上一个对象,(注意第一次是向nil发送release消息)_car = [car retain]; }
|