JSONKit 是不是会造成内存泄漏?

Posted

技术标签:

【中文标题】JSONKit 是不是会造成内存泄漏?【英文标题】:Is JSONKit creating memory leaks?JSONKit 是否会造成内存泄漏? 【发布时间】:2012-10-29 16:12:29 【问题描述】:

我一直在我的应用程序中使用JSONKit,但现在我已升级到 Xcode 4.5.1 并运行分析,Xcode 报告 JSONKit 代码中可能存在内存泄漏。

/Users/aleksa.topic/SVN/Apple/iTTChart/trunk/iTTChart/Other Sources/JSONKit.m:682:23: Memory is never released; potential leak of memory pointed to by 'array' (并且它为字典提供了相同的潜在泄漏)。

有人有这方面的经验吗?是真的造成内存泄漏还是只是 Xcode 的分析不够好?

【问题讨论】:

【参考方案1】:

这是静态分析器中的误报。有一个bug report 试图解决它。

【讨论】:

有没有办法让分析器忽略它?【参考方案2】:

看到这个link。只需将标记为 - 的行替换为标记为 + 的行。

-    if((array = [array init]) == NULL)  return(NULL); 
+    if([array init] == NULL)  free(array); return(NULL); 

-    if(JK_EXPECT_F((array->objects = (id *)malloc(sizeof(id) * array->capacity)) == NULL))  [array autorelease]; return(NULL); 
+    if(JK_EXPECT_F((array->objects = (id *)malloc(sizeof(id) * array->capacity)) == NULL))  free(array); return(NULL); 

-    if((dictionary = [dictionary init]) == NULL)  return(NULL); 
+    if([dictionary init] == NULL)  free(dictionary);return(NULL); 

-    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * dictionary->capacity)) == NULL))  [dictionary autorelease]; return(NULL); 
+    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * dictionary->capacity)) == NULL))  free(dictionary); return(NULL); 

【讨论】:

我不确定这是误报,因为我已经发生了这种内存泄漏。此修复不会泄漏【参考方案3】:

((array = [array init]) == NULL) 替换为(dictionary == NULL) 并使用free(array) 函数而不是[array autorelease] 来修复它。 因为它是手动分配的,所以它也应该手动释放。

【讨论】:

以上是关于JSONKit 是不是会造成内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏 JSONKit iOS

哪些操作会造成内存泄漏以及如何解决内存泄漏

在Java程序中这样会不会造成内存泄漏?

闭包会造成内存泄漏吗?

常见的内存泄漏原因及解决方法

闭包会造成内存泄漏吗