问:这段代码是否合理?如果不合理,给出修改意见.
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
Person *per = [[Person alloc] init];
[per autorelease];
}
}
一般面试题都有问题,不然怎么考察你?你说呢?
所以这道题是存在问题的.
问题在于:一直开辟空间,却没有释放,造成内存堆积,最后程序crash.
解决方案:
@autoreleasepool {
for (int i = 0; i < 100000; i++) {
@autoreleasepool {
Person *per = [[Person alloc] init];
[per autorelease];
}
}
}
原理:每开辟一次空间,就销毁一次,这样就不会造成内存的堆积.autorelease会将声明为autorelease的对象放入离他最近的自动释放池中,当自定释放池销毁时,会向池中的每一个对象发送一个release消息.
内存管理的原则:如果你对一个对象进行了alloc,retain,copy之后,你就拥有了该对象的所有权,你就必须对它进行release或者autorelease.