御用占位图:
自动释放池块:
自动释放池块是允许你放弃对一个对象的持有关系,但可避免它立即被回收的一个工具。当从方法返回对象的时候,这种功能非常有用。
它能确保在块内创建的对象会在块完成时被回收。这在创建了多个对象的场景中非常有用。本地的块可以 用来尽早的释放其中的对象,从而使内存用量保存在较低的水平。
代码示例:
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{
//代码
}
}