Создает ли JSONKit утечки памяти?

Я использовал 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 недостаточно хорошо анализирует?


person Aleksa    schedule 29.10.2012    source источник


Ответы (3)


Это ложное срабатывание статического анализатора. Есть отчет об ошибке, пытающийся решить эту проблему.

person lqs    schedule 29.10.2012
comment
И есть ли способ заставить анализатор игнорировать это? - person Aleksa; 29.10.2012

См. эту ссылку. Просто замените строки, отмеченные как -, на строку, отмеченную как +.

-    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); }
person Baby Groot    schedule 24.05.2013
comment
Я не уверен, что это ложное срабатывание, так как у меня произошла утечка памяти. Это исправление не протекает - person absessive; 21.08.2013

Замените ((array = [array init]) == NULL) на (dictionary == NULL) и используйте функцию free(array) вместо [array autorelease], чтобы исправить это. Поскольку он назначается вручную, его также следует выпускать вручную.

person Aina    schedule 02.05.2013