Autoreleasepool的使用

御用占位图:


Autoreleasepool的使用_第1张图片
IMG_2006.JPG
自动释放池块:

自动释放池块是允许你放弃对一个对象的持有关系,但可避免它立即被回收的一个工具。当从方法返回对象的时候,这种功能非常有用。
它能确保在块内创建的对象会在块完成时被回收。这在创建了多个对象的场景中非常有用。本地的块可以 用来尽早的释放其中的对象,从而使内存用量保存在较低的水平。

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

块中所有收到过autorelease消息的所有对象都会在autoreleasepool块结束时收到relese消息。更重要的是,每个autorelease调用都会发送一个release消息。这就意味着如果一个对象收到了不止一次的autorelease消息。那它会多次收到release消息。看了main方法后你会发现整个应用都在autoreleasepool块中,这意味着所有的autorelease对象最后都会被回收,不会导致内存泄露。

自动释放池使用场景:

Cocoa希望代码能在autoreleasepool块内执行,否则autorelease对象无法释放,AppKit和UIKit框架将事件-循环的迭代放入了autoreleasepool块中,因此,通常你不需要再创建autoreleasepool块。
在一些特定的情况下,比如:
1.当你有一个创建了很多临时变量的循环时,在循环中使用autoreleasepool块可以为每个迭代释放内存,虽然迭代前后最终的内存使用相同,但是应用的最大内存需求可以大大降低。

    @autoreleasepool{
        for (NSDictionary*dic in self.groupMemberList) {
            @autoreleasepool{
                DYGroupTalkSelectModel *model = [[DYGroupTalkSelectModel alloc] init];
                model.friendIcon = dic[@"icon"];
                model.friendName = dic[@"name"];
                model.friendId = dic[@"cpaUserId"];
                [self.groupModels addObject:model];
            }
        }
    }
  

2.自定义线程中的自动释放池块:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadStart:) object:nil];
    [myThread start];
}
- (void)myThreadStart:(id)obj{
    @autoreleasepool{
        //代码
    }
}

你可能感兴趣的:(Autoreleasepool的使用)