我查了很多资料,但没有找到任何东西。也许我不能很好地搜索)据我所知,ARC就像编译工具一样工作。该工具实际上代替开发人员在汇编代码中设置释放和保留。但我的问题是,例如,如果我们在随机值循环中创建对象,它将如何工作?
int value = arc4random_uniform(74);
for(int i=0; i<value; ++i) {
MyObject* my = [MyObject new];
}
那么它将如何解决,因为在编译时我们不知道对象的数量。如果它像MyObject* my = [MyObject new];
之后一样工作arc只需添加[my release];
如果现在要释放的话为什么我们应该使用autoreleasepool???
最佳答案
这取决于编译器的突发奇想,并且可能会根据目标架构、操作系统版本和/或编译器优化设置而变化。
循环的次数并不重要。
实际上,这是:
for(int i=0; i<value; ++i) {
MyObject* my = [MyObject new];
}
可能编译为:
for(int i=0; i<value; ++i) {
MyObject* my = [[MyObject new] autorelease];
}
或者这个:
for(int i=0; i<value; ++i) {
MyObject* my = [MyObject new];
[my release];
}
两者都完全有效。
通过分析,您可能会发现,如果 for()
循环体产生大量自动释放噪音,则需要使用 @autoreleasepool {}
包围该循环体。环形。或许。不过,通常来说,大量的自动释放池流量表明存在算法问题。优化内存抖动对于性能通常至关重要。
关于ios - ARC 如何在循环中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844132/