iphone: как устранить эту утечку памяти?

#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, чтобы помочь обнаружить утечки памяти еще до развертывания на тестовом устройстве.