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{}