【发布时间】:2014-05-03 22:32:25
【问题描述】:
我有一个大的 NSArray (wordDictionary),我正在一个 for 循环中从它创建更小的子数组。如果 for 循环设置为 20,000 次迭代,一切正常。但是,如果我将 for 循环迭代次数增加到 200,000 次迭代,我会得到一个 malloc 错误……这是为什么呢?
我注意到如果我将子数组分配从循环内部移动到循环外部,它就解决了问题!(?)请注意,所有子数组在两种情况下都是相同的(这只是为了演示问题)。这是循环内的赋值代码(导致 malloc 错误):
NSArray *subArray;
//subArray = [wordDictionary subarrayWithRange:(NSRange){50000,20000}];
for (int i=0;i<200000;i++)
{
subArray = [wordDictionary subarrayWithRange:(NSRange){50000,20000}];
testBool = [subArray containsObject:@"hello"];
}
NSLog(@"Done");
如果将子数组赋值移到循环外(如注释行所示),则上述代码有效
在我收到的错误消息中包含以下内容:
* mach_vm_map(size=8388608) 失败(错误代码=3) 错误:无法分配区域 由于未捕获的异常“NSMallocException”而终止应用程序 原因:'* NSAllocateObject():尝试分配类'__NSArrayI'的对象失败' libc++abi.dylib:以 NSException 类型的未捕获异常终止
欢迎任何关于可能导致此问题以及如何解决此问题的提示!谢谢!!
【问题讨论】:
-
内存不足了吗?大小为
20000的数组似乎很大。 -
wordDictionary (NSArray) 中有近 200,000 个元素。在这个例子中,subArray 有 20,000 个元素。但是只有一个实例,它被一遍又一遍地重复使用,所以我认为它应该没问题。但是,当分配在循环之外时,一切正常。因此,如果我对 subArray 的分配存在内存泄漏并且它被调用了 200K 次,那很可能是原因......
-
因为循环中没有@autorelease 块。
标签: objective-c xcode