我努力修复我所做的帮助函数中的内存泄漏。助手功能需要的从NSJSONSerialization处理基础对象时发生内存泄漏
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError * _Nullable *)error
的结果,所有的叶元素融入NSString的,如果他们是NSNumbers转换。
这里是方法:
-(NSArray *) stringisizeObjects:(NSArray *)inputArray{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *mutable = [[NSMutableArray alloc] initWithCapacity:[inputArray count]];
for (int i = 0; i < [inputArray count]; i++) {
NSArray *keys = [inputArray[i] allKeys];
NSMutableDictionary *addDictionary = [[NSMutableDictionary alloc] initWithCapacity:[keys count]];
for (int j = 0; j < [keys count]; j++) {
id theObject = [[inputArray[i] objectForKey:keys[j]]autorelease];
if ([theObject isKindOfClass:[NSNumber class]]) {
[addDictionary setObject:[theObject stringValue] forKey:keys[j]];
[theObject release];
}else if ([theObject isKindOfClass:[NSString class]]){
[addDictionary setObject:[inputArray[i] objectForKey:keys[j]] forKey:keys[j]];
}
}
[mutable addObject:addDictionary];
}
NSArray *returnArray = [mutable copy];
[mutable removeAllObjects];
[mutable release];
[pool drain];
return returnArray;
}
这里是我得到的输入数组。
id parsedThingy = [NSJSONSerialization JSONObjectWithData:resultJSONData options:1 error:&jsonDecodeError];
之前,我可以将结果传递给我的stringisize方法,我必须确保我有NSDictionaries的一个NSArray与匹配的密钥。
NSArray *resultArray = [self stringisizeObjects:parsedThingy];
的X代码内存泄漏工具已经向我指出这种方法,我的问题的原因。
正如你可以看到我已经尝试了自动释放池,自动释放,释放包裹的东西。我只是在这里看不到任何方向。
这是一个24/7全天候运行的非ARC项目。
编辑:我接受了Droppy的建议,并尝试使用mutableCopy重写该方法。泄漏仍在那里。在这一点上,我唯一的工作可能是改变JSON的来源以仅发送字符串。 :(
-(NSArray *) stringisizeObjects2:(NSArray *)inputArray{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *mutableArray = [inputArray mutableCopy];
for (int i = 0; i < [mutableArray count]; i++) {
NSMutableDictionary *mutableDict = [mutableArray[i] mutableCopy];
NSArray *keys = [mutableDict allKeys];
for (int j = 0; j < [keys count]; j++) {
if ([[mutableDict objectForKey:keys[j]] isKindOfClass:[NSNumber class]]) {
NSString *stringValue = [[mutableDict objectForKey:keys[j]] stringValue];
[mutableDict removeObjectForKey:keys[j]];
[mutableDict setObject:stringValue forKey:keys[j]];
}
}
mutableArray[i] = [mutableDict copy];
[mutableDict release];
}
NSArray *returnArray = [mutableArray copy];
[mutableArray release];
[pool drain];
return returnArray;
}
貌似很多的代码,可以用'mutableCopy'所取代。 – Droppy
我遇到了同样的数组内存泄漏问题。我在NSMutableArray中添加图像。即使我像你一样去除了所有物体,它仍然会泄漏。你无能为力,因为它依靠Xcode来清除内存。它在需要时做。但为了避免它的影响,您可以分开您的代码,并根据您的需要在主队列中运行一些部分,并在后台队列中运行一些部分。 – WasimSafdar
在您的源代码中更改NSMutableArray * mutable = [[[[NSMutableArray alloc] initWithCapacity:[inputArray count]] autorelease];并添加[addDictionary release];紧随[mutable addObject:addDictionary];并返回可变; – larva