OC 内存泄露 自动释放池
2015-05-10 00:59
239 查看
花絮:看到下面的代码就想起这么一个调侃:
一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法。提笔思索良久后在纸上写下:Hello world!
/*********************************************************************************/
1 首先说下自动释放池的底层实现
当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中(自动释放池其实并不包含实际的对象本身,仅仅是对释放的对象的引用),当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作.
2 举例
有这么一段代码:largeNumber可以当做一个很大的数
那么会有什么问题呢?
如果largeNumber不大时没有问题,但是当它很大时问题非常严重!造成内存泄露。虽然ARC会自动释放内存,但是ARC内存的释放,即处于栈顶的自动释放池只有完成一次消息循环或被销毁时才会给池子里面的所有对象做一次release操作。当我们使用for循环创建很多个使用autorelease方式创建的NSString对象的时候,将所有的对象的释放权都交给了这个释放池,而这个释放池会等待这个事件处理之后才会释放,因此就会使对象无法及时释放,堆积在内存造成内存泄露。
代码应该这样修改:在循环内添加一个自动释放池,此时自动释放池就会处于当前线程的栈顶,那么每执行一次循环,处于栈顶的自动释放池就会被销毁,那么添加在池子里面的对象就会被释放,则不会造成内存泄露
一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法。提笔思索良久后在纸上写下: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]]; } }
相关文章推荐
- oc-内存管理之自动释放--我自动释放了我使用的所有对象,但程序占用内存还是偏高,为什么?
- OC高效率52之以“自动释放池块”降低内存峰值
- 6、内存管理(自动释放池)-OC
- OC-内存-自动释放池
- Qt中特有的类对象机制——内存自动释放
- 进程终结后, 泄露的堆内存会自动释放吗?
- CBRUSH释放、CreateSolidBrush的内存释放与内存泄露问题及其解决方法
- 第06天OC语言(02):自动释放池注意事项
- 如何让xcode自动检查内存泄露
- iOS-如何让xcode自动检查内存泄露
- C#内存泄露与资源释放 经验总结
- 自动资源释放-使用对象管理资源,解决资源泄露问题
- 如何关闭内存自动释放池ARC
- 在Windows中 , 如何用leakdiag “自动”检测内存泄露 (自动记录日志)
- C++对象数组释放时的非故意内存泄露
- OC学习3——self、自动释放、变量作用域
- [ios] 如何让xcode自动检查内存泄露 【转】
- C++ 0x 使用 shared_ptr 自动释放, 防止内存泄漏
- 如何让xcode自动检查内存泄露
- [ios] 如何让xcode自动检查内存泄露 【转】