iOS 内存管理arc

http://www.tekuba.net/program/346/

 

ios自动释放池(autoreleasepool

 

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface Test : NSObject  
  4. @end  
  5.   
  6. @implementation Test  
  7. @end  
  8.   
  9.   
  10. int main (int argc, const char * argv[]) {  
  11.       
  12.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  13.     Test *test = [[Test alloc]init];  
  14.       
  15.     NSLog(@"对象初始化以后的引用计数为:%x",[test retainCount]);  
  16.       
  17.     [pool drain];  
  18.     NSLog(@"释放自动释放池以后,对象的引用计数为:%x",[test retainCount]);  
  19.       
  20.     pool = [[NSAutoreleasePool alloc]init];  
  21.     [test autorelease];  
  22.     NSLog(@"将对象添加到自动释放池以后的引用计数为:%x",[test retainCount]);  
  23.       
  24.     [test retain];  
  25.     NSLog(@"对象进行retain后的引用计数为:%x",[test retainCount]);  
  26.       
  27.     [pool drain];  
  28.     NSLog(@"释放自动释放池以后,对象的引用计数为:%x",[test retainCount]);  
  29.       
  30.     [test release];  
  31.     return 0;  
  32. }  


通过使用autorelease,该对象就被放入自动释放池,系统自动跟踪每个对象的使用情况,并在释放自动释放池时,释放池中所有对象。

 

上面这一段代码是书上的,但很好说明了autoreleasepool的用法,以前老师们常说不能死读书的,应是多思考,自己动手写实例,多提问,多讨论吧

这里我把的思考写出来,供大家参考:

1.autoreleasepool只能放也池中的对象起作用,我们手工管理内存它不管,也就是说手工或自动(系统)两套不同的机制;

2.加入用[test autorelease],释放用pool drain

 

3.autoreleasepool不是系统的垃圾收集功能(Garbage Colliction)


4.aotoreleasepool到达底什么时候释放?是pool drain后就释放了吗?

对于每一个Runloop, 系统会隐式创建一个Autorelease pool(自然会有多个Autorelease pool),这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。(暂没有在官方文档中找到这个解释)

posted @   itlover2013  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示