从NSJSONSerialization处理Foundation Object时发生内存泄漏

戴维·P

我正在努力解决我做的辅助函数中的内存泄漏。辅助函数的结果为

+ (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;
}
幼虫

问题:

  1. addDictionary致电alloc但未致电releaseautorelease
  2. returnArray = [可变副本]; //确实增加了retainCount +1,需要autorelease在这里
  3. id theObject = [inputArray[i] objectForKey:keys[j]]; //不需要自动释放或释放您不拥有的对象
  4. 将NSAutoreleasePool添加到此处的顶部只是什么都不做

解决方案:

-(NSArray *) stringisizeObjects:(NSArray *)inputArray{
    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]]; // not need autorelease

            if ([theObject isKindOfClass:[NSNumber class]]) {

                [addDictionary setObject:[theObject stringValue] forKey:keys[j]];
                //[theObject release]; // not need release value here

            }else if ([theObject isKindOfClass:[NSString class]]){
                [addDictionary setObject:[inputArray[i] objectForKey:keys[j]] forKey:keys[j]];
            }

        }
        [mutable addObject:addDictionary];
        [addDictionary release]; // release after not use
    }
    NSArray *returnArray = [[[NSArray alloc] initWithArray:mutable] autorelease]; // auto release for return value

    [mutable removeAllObjects];
    [mutable release];
    return returnArray;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从NSJSONSerialization处理Foundation Object时发生内存泄漏

来自分类Dev

使用SinkWriter(Media Foundation)C时发生内存泄漏

来自分类Dev

调试NSJSONSerialization内存泄漏

来自分类Dev

NSJSONSerialization.JSONObjectWithData泄漏内存

来自分类Dev

使用NodeJS时发生内存泄漏

来自分类Dev

调用NSUserDefaults setObject时发生内存泄漏

来自分类Dev

Vulkan:渲染时发生内存泄漏

来自分类Dev

添加列表值时发生内存泄漏

来自分类Dev

使用实体框架时发生内存泄漏

来自分类Dev

扩展类时发生内存泄漏

来自分类Dev

使用MBProgressHUD时发生内存泄漏

来自分类Dev

销毁对象时发生内存泄漏

来自分类Dev

释放链表时发生内存泄漏

来自分类Dev

添加列表值时发生内存泄漏

来自分类Dev

循环使用NSReadPixel时发生内存泄漏

来自分类Dev

Glib:创建GDBusProxy时发生内存泄漏

来自分类Dev

使用DnsGetCacheDataTable时发生内存泄漏

来自分类Dev

处理COM对象内存泄漏

来自分类Dev

Android WeakReference处理内存泄漏

来自分类Dev

处理正则表达式字符串时,wsregex :: compile崩溃(内存泄漏)?

来自分类Dev

处理正则表达式字符串时,wsregex :: compile崩溃(内存泄漏)?

来自分类Dev

结合使用多处理和请求时,是否有更好的方法来避免内存泄漏?

来自分类Dev

在IOS中使用Web服务时,发生NSURLSession内存泄漏

来自分类Dev

循环执行Doctrine查询时发生内存泄漏

来自分类Dev

在Node.js中使用流时发生内存泄漏?

来自分类Dev

消耗消息时发生内存泄漏-RabbitMQ C库

来自分类Dev

生成元组列表时发生内存泄漏

来自分类Dev

在glib中使用垃圾回收时发生内存泄漏

来自分类Dev

用熊猫创建缓冲区时发生内存泄漏?

Related 相关文章

热门标签

归档