第4章 memory management

第四章 memory management

1.内存回收的方式
when the object is used by no one.we should deallocate it.
there are two ways to do this:1.the retain count. 2. garbage collector
1)retain count,就是每当object被引用的时候,也就是有指针指向它,就给该object的count+1,被释放的时候-1. 方法相对复杂,有retain cycle的问题。
2)garbage collector 操作系统每隔一段时间扫描所有使用的object,发现没有被使用的,就自动回收。在target info->build中搜索garbage,然后开启该功能。
由于iphone程序不支持garbage collector,所以需要学习retain count机制。

2.autorelease的使用。

当调用description方法时, result对象生成时,retain count = 1,当有object引用它,count + 1,当object 释放它,count =1,无法被释放。
-(NSString*)description
{
NSString* result;
result = [[NSString alloc] initWithFormat....]
return result;
}
修改方法为在return result之前,加上 [result autorelease]。
autorelease的作用是将release的作用延后,当autorelease pool drain时,再release该object。

很多class自带的函数,会生成一个autorelease的对象。
-(NSString*)description
{return [NSString stringWithFormat:.......]}
在这个函数中,stringWithFormat 生成了一个autorelease对象,该对象retain count = 1,并且被加入到了autorelease pool中。

3.accessor method
-(void)setFoo: (int)x
{
foo=x;
}
在这个函数,中把x的值赋给foo。这个实现是简单的。但是如果x,foo是一个指针。就需要把foo原来指向的对象retain count--,x指向的对象retain count++
这加减的顺序有三种不同的实现方式,且各有优缺点。作者采用先加后减的方式。即
-(void)setFoo: (NSCalendarDate *)x
{
[x retain];
[foo release];
foo = x;
}

《object 2.0》中内存管理总结:

0. 一般对象在放入NSArray中时,retain count 自动 + 1,从数组中删除时自动 -1.

1. “自动释放池”用于在释放池本身时,自动释放池中的对象。每次释放时,系统通过向池中的每一个对象发送一条release消息来实现这个功能。同时,系统会向池中每个引用计数为0的对象发送一条dealloc消息来销毁这个对象。

2. 如果你的方法中不再需要一个对象,但需要返回它,那么向其发送一条autorelease消息,将它标记为以后释放,消息autorelease并不影响对象的引用计数。

3. 如果使用alloc或copy方法直接创建对象,则由你负责释放它。

4. 除了上一个规则中提到的方法之外,不必费心地释放其它方法返回的对象。这不是你的责任,这些对象应当被它们的方法自动释放。这就是为什么首先需要在程序中创建自动释放池的原因。stringWithString:之类的方法自动向新创建的字符串对象发送一条autorelease消息,把它们添加到自动释放池。如果没有事先创建池,就会收到一条出错消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值