#iphone #objective-c #ios #memory-management #instruments
#iPhone #цель-c #iOS #управление памятью #инструменты #objective-c
Вопрос:
Как устранить эту утечку памяти… Я даже выпускаю его в конце, как на картинке, но он все еще там. В выражении if почти 10-15 условие его использования похоже на данный код… Но в конце я его отпускаю.
LoginResponse *response = [[LoginResponse alloc] initWithMessageString: messageString];
ServerMessage *ackMessage = [[ServerMessage alloc] initWithMessageToAck:response];
[[NSNotificationCenter defaultCenter] postNotificationName:@"SendMessageToServer" object:ackMessage];
[[NSNotificationCenter defaultCenter] postNotificationName:@"LoginResponseReceived" object:response];
Комментарии:
1. вы освобождаете строку за пределами того
if
места, где вы ее создали
Ответ №1:
Вы не выпускаете messageString
. То, что вы делаете, это:
// there's a messageString
if(...){
NSString* messageString= [[NSString alloc] init ... ]
// you're declaring new messageString,
// not related to the outer messageString
...
// and you didn't release the inner messageString.
// The pointer messageString just goes away.
}
[messageString release]; // you're releasing outer messageString, not inner messageString.
Выполните «Анализ» из XCode. (Это ниже пункта меню «сборка».) Я думаю, что это должно решить проблему забывания освободить внутренний messageString
. Используйте «Анализ» перед запуском инструментов.
Комментарии:
1. Build and Analyze действительно жалуется на подобные вещи, но я не уверен, что так и должно быть.
2. Почему бы и нет? Я не говорю о скрытии строки внешнего сообщения внутренней строкой сообщений; Я говорил о том, что OP не выпустил внутреннюю строку сообщений. Ну, я не сказал этого в своем ответе: p
Ответ №2:
Посмотрите, сохраняете ли вы это где-то еще в коде. Если это так, это может потребовать дополнительного выпуска. Также обратите внимание, что метод, который вы можете использовать, передавая messageString
в качестве аргумента, также может сохранять его.
Ответ №3:
Не забудьте освободить строку внутри if
блока.
Ответ №4:
Основное эмпирическое правило заключается в том, что для каждого alloc
, new
, retain
, или copy
, вам нужно release
или autorelease
. Кажется, что вам release
autorelease
где-то не хватает или.
Кстати, вы можете (и должны) использовать «Сборку и анализ» Xcode, чтобы помочь обнаружить утечки памяти еще до развертывания на тестовом устройстве.