在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?
答案 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
}