示例:
@autoreleasepool { for (int i=0; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替) Person *per = [[Person alloc] init]; [per autorelease]; } }
内存管理的原则:如果对一个对象使用了alloc、copy、retain,那么你必须使用相应的release或者autorelease。咋一看,这道题目有alloc,也有autorelease,两者对应起来,应该没问题。但autorelease虽然会使引用计数减一,但是它并不是立即减一,它的本质功能只是把对象放到离他最近的自动释放池里。当自动释放池销毁了,才会向自动释放池中的每一个对象发送release消息。这道题的问题就在autorelease。因为largeNumber是一个很大的数,autorelease又不能使引用计数立即减一,所以在循环结束前会造成内存溢出的问题。
修改如下:
@autoreleasepool { for (int i=0; i[100000; i++) { (因识别问题,该行代码中尖括号改为方括号代替) @autoreleasepool { Person *per = [[Person alloc] init]; [per autorelease]; } } }
在循环内部再加一个自动释放池,这样就能保证每创建一个对象就能及时释放。