Утечка памяти на приборе в строке NSStringWithFormat - PullRequest
0 голосов
/ 22 февраля 2012

В моем appDelegate я использую LocationManager:

- (void)locationManager: (CLLocationManager *)manager
    didUpdateToLocation: (CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

    float latitude = newLocation.coordinate.latitude;
     strLatitude = [NSString stringWithFormat:@"%f",latitude];
    float longitude = newLocation.coordinate.longitude;
    strLongitude = [NSString stringWithFormat:@"%f", longitude];
    [self CheckOperation];

}  

strLatitude и strLongitude являются глобальными строками. Это абсолютно нормально. Даже при анализе приложения у меня не возникает утечки памяти. Но когда я профилирую свое приложение, я получаю утечку памяти на

strLatitude = [NSString stringWithFormat:@"%f",latitude];  

и

strLongitude = [NSString stringWithFormat:@"%f", longitude];

из 32 байта .

Как я могу это исправить?

1 Ответ

5 голосов
/ 22 февраля 2012

Вы уверены, что видите утечку, а не просто распределение?

Если у вас действительно есть утечка здесь, есть потенциальные подозреваемые:

Вы используете ARC?Если нет, вот некоторые возможные проблемы:

  • Вы выпускаете его в dealloc?

  • Если этот метод запускается более чемодин раз, вы не освобождаете последнее значение, прежде чем переназначить его.

  • Если вы не используете семантику копирования и передаете эту строковую ссылку кому-то другому, а они не выпускают ее должным образом, вы также получите откат назадна эту линию.

РЕДАКТИРОВАТЬ:

(в соответствии с комментариями ниже)

Вы должны понимать, что stringWithFormat: выделяет строку и ставит в очередь авто-релиз на ней... так что вам нужно где-то его сохранить.

Я предполагал, что вы делаете это где-то, потому что у вас нет "EXC_BAD_ACCESS" - скорее, предположительно, утечка.

Вы не должны вытекать автоматически выпущенный объект, если вы не сохранили его где-то (отсюда предположение).

Учитывая, что вам нужно где-то его сохранить, мои приведенные выше предложения действительны - каждыйДля retain требуется соответствующий выпуск.

Я согласен, что вы должны использовать свойства для этих строк.

Их просто конвертировать - и многое для вас позаботится.

В вашем интерфейсе:

@property (nonatomic, copy) NSString * strLatitude; 

В вашей реализации:

@synthesize strLatitude;

Назначить:

self.strLatitude = ...

(«я»).часть важна)

И убедитесь, что вы установили значение nil в dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...