博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@autoreleasepool-内存的分配与释放
阅读量:6455 次
发布时间:2019-06-23

本文共 2180 字,大约阅读时间需要 7 分钟。

@autoreleasepool-内存的分配与释放开发过iOS、Mac的朋友应该对“ @autoreleasepool ”不陌生。只要在Xcode里创建一个工程,就能看到下面这样的代码://iOS programint main(int argc, char * argv[]) {  @autoreleasepool {    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  }}//Command line programint main(int argc, const char *argv[]) {  @autoreleasepool {    //...  }  return 0;}看,每个 main 函数的主体都被 @autoreleasepool 的Block块包在里面,也就是说,接下来所有的对象创建都在这个block里面。那么, @autoreleasepool 的作用到底是什么呢?我们开发中可以用它来做什么呢?可以在某些情况下,大幅度降低程序的内存占用,如下图:测试的内容:500000次循环,每次循环创建一个NSNumber实例和两个NSString实例。图:红线表示没有用 @autoreleasepool 时的内存占用。图:绿线表示用了 @autoreleasepool 优化后的内存占用!效果是不是很明显!代码Github地址: AutoReleasePoolTestExample Xcode 6, iOS 8, iPhone 5模拟器.MRC 与 ARCMRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),分别对应着手动引用计数和自动引用计数。对!是计数,不是“ GC、垃圾回收 ”什么的,就是说,在Objective-C的开发中,ARC不代表像Java那样有GC做垃圾回收,所以本质上还是要“手动”管理内存的。也就是说,我们在ARC环境下写的代码,不用自己手动插入“ retain、release这些消息 ”,ARC会在编译时为我们在合适的位置插入,释放不必要的内存。而 @autoreleasepool 就跟对象的 release 密切相关。@autoreleasepool 干了啥在MRC时代,如果我们想先retain一个对象,但是并不知道在什么时候可以release它,我们可以像下面这么做:NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];NSString* str = [[[NSString alloc] initWithString:@"tutuge"] autorelease];//use str...[pool release];//str is released就是说,我们可以在创建对象的时候给对象发送“ autorelease ”消息,然后当 NSAutoreleasePool 结束的时候,“标记过”autorelease的对象都会被“ release ”掉,也就是会被释放掉。但是在ARC时代,我们不用手动发送 autorelease 消息,ARC会自动帮我们加。而这个时候, @autoreleasepool 做的事情,跟 NSAutoreleasePool 就一模一样了。什么时候用@autoreleasepool根据 Apple的文档 ,使用场景如下:写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。写循环,循环里面包含了大量临时创建的对象。(本文的例子)创建了新的线程。(非Cocoa程序创建线程时才需要)长时间在后台运行的任务。利用@autoreleasepool优化循环利用@autoreleasepool优化循环的内存占用,我觉得最有用的一点,下面就说说这个点。如下面的循环,次数非常多,而且循环体里面的对象都是临时创建使用的,就可以用 @autoreleasepool 包起来,让每次循环结束时,可以及时的释放临时对象的内存。//来自Apple文档,见参考NSArray *urls = <# An array of file URLs #>;for (NSURL *url in urls) {  @autoreleasepool {    NSError *error;    NSString *fileContents = [NSString stringWithContentsOfURL:url                     encoding:NSUTF8StringEncoding error:&error];    /* Process the string, creating and autoreleasing more objects. */  }}这么做的效果是极其显著地,就如本文最开始的图一样,可以自己把示例工程下回来运行下试试~总结@autoreleasepool看起来很不“起眼”,平常开发很容易就忽略它了,但是仔细一看,确如此有用~参考

转载地址:http://ehfzo.baihongyu.com/

你可能感兴趣的文章
线段树分治
查看>>
git代码冲突
查看>>
lnmp1.3 配置pathinfo---thinkphp3.2 亲测有效
查看>>
利用android studio 生成 JNI需要的动态库so文件
查看>>
poll
查看>>
衡量优秀的卓越的前端工程师
查看>>
解析查询 queryString 请求参数的函数
查看>>
学生选课系统数据存文件
查看>>
4.6 直接插入排序法
查看>>
我的毕设总结所用的技术和只是要点 基于stm32F4的AGV嵌入式控制系统的设计
查看>>
盘点国内外那些有野心的BI公司
查看>>
JMeter—断言
查看>>
C++的新类创建:继承与组合
查看>>
m5-第9周作业
查看>>
odoo 权限设置
查看>>
asp操作access提示“无法从指定的数据表中删除”
查看>>
git bash 风格调整
查看>>
997D Cycles in product
查看>>
bzoj4589 Hard Nim
查看>>
java实现pdf旋转_基于Java实现PDF文本旋转倾斜
查看>>