美文网首页IOS面试专题
iOS面试:自动释放池如何工作?release和autorele

iOS面试:自动释放池如何工作?release和autorele

作者: 世玉茹花 | 来源:发表于2017-08-14 14:48 被阅读74次

    release和autorelease区别:release只是把对象引用计数-1。autorelease实际上只是把release延迟调用了【autorelease会在对象真正使用结束时候才做引用计数-1】,系统只是把对象放入了autoreleasepool中,当pool释放时,该pool中所有对象就会被调用release。

    autoreleasepool并不是程序退出时才将里面对象release。对于每一个runloop,系统会隐式的创建一个autoreleasepool构成一个像callstack一样的栈式结构,在runloop结束时,当前栈顶的release pool会被销毁,这个pool里面每个对象也会被release。

    原理:NSAutoreleasepool实际上是个对象引用计数自动处理器。ARC中,系统自动帮我们嵌入.当pool释放时,该pool中的所有对象就会被调用release。

    ARC年代,系统自动管理自己的autoreleasepool,runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会清理掉被autorelease处理过的对象。。

    所以,如果循环创建了很多临时对象,可以在循环中使用自动释放池block,下次迭代前处理这些对象,再循环中使用自动释放池block,有助于进减少内存占用。

    for (NSURL *url in urls) {

    @autoreleasepool {

    NSError *error;

    NSString *fileContents = [NSString stringWithContentsOfURL:url

    encoding:NSUTF8StringEncoding

    error:&error];

    }

    }每个@autoreleasepool结束时,里面的临时变量就会回收,内存使用更加合理。

    autoreleasepool何时释放:(1)手动释放autoreleasepool(2)runloop结束后自动释放。

    手动创建:NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;

    ARC下,不能调用autorelease,可以使用@autoreleasepool{}

    相关文章

      网友评论

        本文标题:iOS面试:自动释放池如何工作?release和autorele

        本文链接:https://www.haomeiwen.com/subject/mreurxtx.html