189 8069 5689

iOS优化内存,提升性能之五-创新互联

Advanced Autorelease Pool 高级自动释放池

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、五常网站维护、网站推广。

在之前的章节你已经学习了很多基本的内存方面的知识。这个部分将会涉及到使用自动释放的高级技术,同时展示你应该在哪里使用,从而在受限的情况下获得比较高的性能。

在每一个线程中,你应该要有一个自动释放池来收集和存储所有自动释放的对象。如果在每一个线程中,没有自动释放池的话,所有的autoreleased对象会泄露,你将会有一个重大的内存泄露。自动释放池是通过栈的形式组织在一起的;下面部分会解释。

自动释放池和栈

自动释放池存储在一个栈中,通常被理解成嵌套的。无论何时你创建一个新的自动释放池,它都会被push到栈的顶部。然后所有新的autoreleased对象会被push到这个新的自动释放池中。

通过下面的代码你可以看到,对象(比如myArray和myString)内部的方法doSomething将会存储在myPool中,而不是应用的main pool中:

- (void)doSomething {

  @autoreleasepool {

      NSArray *myArray = [NSArray array];

      NSString *myString = [NSString string];

   }

}

这是main方法的main pool:

int main(int argc, char *argv[]){

  @autoreleasepool {
      int retVal = UIApplicationMain(argc, argv, nil, nil);

   }

  return retVal;

}

在@autoreleasepool块结束的时候,当时间生命周期结束时,所有存储在这个pool中的autoreleased对象jiang将被released。

图7-9展示了这个概念。对于一个好的性能来说,这是一个非常重要的概念 --  知道尽可能快的release对象。

iOS优化内存,提升性能 之五

自动释放池和线程

当创建一个新的线程时,你需要创建一个新的自动释放池对象,然后将这个pool和新的线程联系在一起。因此当线程停止时,你的自动释放池会deallocated,所有的autoreleased对象也会deallocated。第6章我会深入的讨论这个主题,所以你应该复习一下,如果你在理解概念时需要一些帮助的话。

自动释放池对性能的影响

旧的内存管理规则依然能够应用在用ARC编写的代码上,如果你没有使用new,alloc和copy调用一个方法,这个对象就已经是autoreleased了。如果你在一个循环中创建了很多的autoreleased对象,很快内存就会耗尽。

这个代码演示了在循环中处理内存管理最好的方法:

- (void)doSomethingWithAutoRelease {

    for (int i = 0; i < 1000; i++) {

        @autoreleasepool {
        Product *product = [Product productWithItemID:@""];

        // process and display the product here

        }

    }

}

在循环结束的时候,以及在@autoreleasepool块的尾部,所有的autoreleased对象会released。这种方法你能够控制和release所有位使用的对象和回收你的内存。

Instruments

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:iOS优化内存,提升性能之五-创新互联
分享地址:http://jkwzsj.com/article/ddijec.html

其他资讯