Не использовать -retainCount.
Абсолютное количество сохраняемых объектов не имеет смысла.
Вы должны вызывать release
ровно столько раз, сколько вы вызывали сохранение объекта. Не меньше (если вам не нравятся утечки) и, конечно же, не больше (если вам не нравятся сбои).
Подробнее см. Рекомендации по управлению памятью .
<Ч />
В вашем коде есть несколько проблем:
вы не следуете правильному шаблону init
. У вас должно быть где-то self = [super init...]; if (self) {...}
.
tempFileName
- это свойство retain
, и вы присваиваете ему результат alloc/init
. Будет утечка.
Неизменяемая пустая строка ([[NSString alloc] init]
) почти никогда не используется. И, на самом деле, stringFromFileAtPath
просачивается (технически - в деталях реализации есть пустая неизменяемая одиночная строка и, таким образом, нет реальной утечки, но .... все же ...)
Наконец, сбой: ваш метод readLine
правильно возвращает автоматически выпущенный объект. Тем не менее, ваш while()
цикл, потребляющий возвращаемое значение readLine
, также release
возвращает это возвращаемое значение, что приводит к двойному освобождению и попытке освободить то, что уже было освобождено.
Вы должны «построить и проанализировать» свой код. Могу поспорить, что статический анализатор llvm определит большинство, если не все, проблемы, о которых я говорил выше (и, возможно, еще некоторые, которые я пропустил).
<Ч />
При сборке с помощью анализатора у вас в окне «Сборка» выбраны «все сообщения» или «только проблемы с анализатором»? Потому что, глядя на код, я удивляюсь, что анализатор не уловил очевидную проблему с stringFromFileAtPath
.
За исключением кода, у вас есть следующие строки, которые манипулируют stringFromFileAtPath
:
NSString *stringFromFileAtPath = [[NSString alloc] init];
....
stringFromFileAtPath = [NSString stringWithContentsOfFile:tempFilePath
encoding:NSUTF8StringEncoding
error:&error];
....
stringFromFileAtPath = remainContent;
....
[stringFromFileAtPath release];
А remainContent
устанавливается:
remainContent = [stringFromFileAtPath stringByReplacingCharactersInRange:firstLineChangeLineIncludedRange
withString:@""];
Вы освобождаете автоматически освобожденный объект. К память продолжает расти , как вы ее измеряете? Не используйте Activity Monitor, поскольку он почти бесполезен для разработчиков, поскольку retainCount
вводит в заблуждение. Используйте инструменты.