在iOS中使用ARC的自动释放池

时间:2015-03-30 06:06:25

标签: ios

在iOS中,当autoreleasepool创建并被销毁时?

创建触摸事件时,runloop会创建一个autoreleasepool。 当触摸事件结束时,autoreleasepool将被销毁。

我对autoreleasepool的理解是对吗?

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

我如何理解main方法中的autoreleasepool?

2 个答案:

答案 0 :(得分:1)

在xcode 4中我们必须创建池,我们已使用NSAutorealeasePool的语法释放它:

{
    NSAutorealeasePool *pool=[[NSAutorealeasePool alloc] init];
    [pool drain];
}

当在Xcode 4中使用这样的内存时,为你的池初始化内存并控制进入你的池中使用drain来释放你的池对象..如果你使用drain意味着你永久地破坏ypur池对象..如果你使用释放方式它没有完全被摧毁..

在xcode 5中,我们使用@autoreleasepool语法,如下所示:

@autoreleasepool
{

}

这里我们不需要创建池并释放对象..编译器完成的所有事情.once control自动创建池并释放池对象意味着我们要解除分配

答案 1 :(得分:0)

NSAutoreleasePool类用于支持Cocoa的引用计数内存管理系统。自动释放池存储在池本身耗尽时发送释放消息的对象。

重要

如果使用自动引用计数(ARC),则无法直接使用自动释放池。相反,您使用@autoreleasepool块。例如,代替:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];
你会写:

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}

@autoreleasepool块比直接使用NSAutoreleasePool实例更有效;即使您不使用ARC,也可以使用它们。

要记住的事情很少 -

案例1)

@autoreleasepool 
{
    MyObject *obj = [[MyObject alloc] init]; 
    //No need to do anything once the obj variable is out of scope there are no strong pointers so the memory will free
}

案例2)

MyObject *obj //strong pointer from elsewhere in scope  

@autoreleasepool 
{
    obj = [[MyObject alloc] init]; 
    //Not freed still has a strong pointer 
}