A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hejianchun 中级黑马   /  2015-9-23 10:29  /  765 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内存管理的原则
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];
}







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马