iOS面试:自动释放池如何工作?release和autorelease区别?

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

你可能感兴趣的:(iOS面试:自动释放池如何工作?release和autorelease区别?)