【发布时间】:2013-05-23 04:17:42
【问题描述】:
在我的理解中,如果ARC被启用,@autoreleasepool{}里面的对象应该在它们不再使用时被释放。
但是代码
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
for (int i = 0; i < 1000000000; i++) {
NSString *string = @"ab c";
NSArray *array = [string componentsSeparatedByString:string];
}
}
return 0;
}
内存泄漏。
仪器显示泄露的对象是由 -[NSString componentsSeparatedByString:] 创建的 __NSArrayM
那么,问题是:为什么 __NSArrayM 对象没有在创建它们的同一循环迭代中被销毁?
谁能帮我解决这个问题
更新:感谢您的回答,我似乎错误地使用了“内存泄漏”一词,并且误解了 @autoreleasepool{} 的工作原理。为了解决这个问题,我应该在 for 循环中放置 @autoreleasepool{}。
【问题讨论】:
-
这段代码分配了很多内存但没有泄漏。
-
如果你知道这会造成泄漏,为什么还要做这么大的循环来证明这一点而不是一次迭代呢? :)
-
我实际上认为这是一个很好的问题示例。我不知道为什么它获得了如此多的反对票。
-
@JamesWebster 因为在命令式语言中,质疑过大循环或对象的奇怪行为是荒谬的。如果这是 Haskell,那就不一样了。
-
这个问题很好地说明了发布池的含义。通过使循环变大,它可以使问题得到更大的缓解。特别是对于来自新用户的问题,反对票似乎过多,尤其是在没有建设性批评的情况下。我看不出这个问题如何违反 SO 的任何原则。如果您认为编写一段代码很愚蠢,那这不是学习吗?
标签: objective-c automatic-ref-counting autorelease