您的位置:首页 > 其它

OC 内存泄露 自动释放池

2015-05-10 00:59 239 查看
花絮:看到下面的代码就想起这么一个调侃:

  一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法。提笔思索良久后在纸上写下:Hello world!

/*********************************************************************************/

1 首先说下自动释放池的底层实现

当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中(自动释放池其实并不包含实际的对象本身,仅仅是对释放的对象的引用),当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作.

2 举例

有这么一段代码:largeNumber可以当做一个很大的数

for (int i = 0 ; i < largeNumber; i++) {
NSString *myStr = @"Hello world"; // 原谅我用Hello world
myStr = [myStr stringByAppendingString:[NSString stringWithFormat:@"-%05d-",i]];
}


  那么会有什么问题呢?

  如果largeNumber不大时没有问题,但是当它很大时问题非常严重!造成内存泄露。虽然ARC会自动释放内存,但是ARC内存的释放,即处于栈顶的自动释放池只有完成一次消息循环或被销毁时才会给池子里面的所有对象做一次release操作。当我们使用for循环创建很多个使用autorelease方式创建的NSString对象的时候,将所有的对象的释放权都交给了这个释放池,而这个释放池会等待这个事件处理之后才会释放,因此就会使对象无法及时释放,堆积在内存造成内存泄露。

  代码应该这样修改:在循环内添加一个自动释放池,此时自动释放池就会处于当前线程的栈顶,那么每执行一次循环,处于栈顶的自动释放池就会被销毁,那么添加在池子里面的对象就会被释放,则不会造成内存泄露

for (int i = 0 ; i < largeNumber; i++) {
@autoreleasepool {
NSString *myStr = @"Hello world";
myStr = [myStr stringByAppendingString:[NSString stringWithFormat:@"-%05d-",i]];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: