2013-05-27 3 views
4

Привет, я имею дело с утечкой памяти, но я не могу понять, в чем проблема (у меня нет большого опыта работы с инструментами, поэтому, пожалуйста, извините меня, если я прошу что-то очевидное) ,NSString stringwithFormat утечка памяти с ARC

В принципе у меня есть две строки, как свойства в моем классе, первое, что будет показано пользователю извлекается в основной очереди, и один, что не требуется немедленно извлекается в фоновом очереди:

@property (nonatomic, strong) NSString *stringDefaultLocationAddress; 
@property (nonatomic, strong) NSString *stringCurrentLocationAddress; 

-(void)viewDidLoad{ 
    ... 
      dispatch_async(idQueue, ^(void) { 
      [self recuperaDireccionActualEnBackground:currentUserLocation.coordinate]; 
     }); 

} 

- (void)dealloc{ 
    [self removeObserver:self forKeyPath:@"playerProfileNeedsUpdate"]; 
    self.stringCurrentLocationAddress = nil; 
    self.stringDefaultLocationAddress = nil; 
} 

Но я получаю эту утечку в инструментах: code leak enter image description here

проблема связана с заполнителями @ «% @ ...» в stringWithFormat, потому что если я просто положить @ „тест“ в этот момент утечка исчезла, но я не знаю, почему lea король, и я хотел бы это понять.

Заранее благодарен.

+2

Если вы положили только '@" Test ", вы создаете постоянную времени компиляции, которая не может протекать. Сообщение '- [NSString copy]' приводит к копированию, когда оно изменено (подкласс 'NSMutableString') или сохраняется, когда оно является неизменным (подкласс' NSString'). Поэтому всегда копируйте при объявлении 'NSString'. Копирование изменяемой строки гарантирует, что клиент не будет удаленно изменить значение, которое вы сохранили в свойстве. Если вы используете iOS 5, у вас есть геокод и обратный геокод в 'CLGeocoder', вам не нужна библиотека. Вам не нужно указывать переменные в 'dealloc', ARC уже освобождает свойства. – Jano

+0

Благодарю вас @Jano за ваш ответ. Я только что добавил сообщение COPY этой строке, и теперь у меня нет утечки памяти, спасибо за ваш добрый ответ. – Rubs

+0

Я имел в виду объявленный: @property (неатомный, COPY) NSString * stringDefaultLocationAddress; – Rubs

ответ

3

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

Если вы используете ARC во всем своем коде, я подозреваю, что вы неправильно использовали __bridge_retained или CFBridgingRetain(). Или, может быть, вы сделали правильный переход с моста на CFStringRef, но после этого не смогли правильно выполнить ручной подсчет ссылок.

Определенно создайте статический анализатор и устраните все возникающие проблемы (или, по крайней мере, убедитесь, что они ложные срабатывания).

Смежные вопросы