Какао Touch - как правильно назначить новое значение указателю без утечки памяти? - PullRequest
0 голосов
/ 22 октября 2009

Я только что закончил свое первое простое приложение для iPhone; Я использую инструменты, чтобы найти утечки памяти.

Я немного растерялся относительно того, как повторно использовать указатели. Я прочитал документацию Apple, но все еще не понимаю правильную процедуру.

Документы Apple говорят: «Другой типичный пример утечки памяти возникает, когда разработчик выделяет память, назначает ее указателю, а затем назначает другое значение указателю, не освобождая первый блок памяти. В этом примере перезаписывается адрес в указателе стирает ссылку на исходный блок памяти, делая невозможным освобождение. "

Действительно ли мне нужно каждый раз выпускать и создавать новый указатель?

Пример создания утечки памяти на dateFormatter:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];    

// year 
[dateFormatter setDateFormat:@"yyyy"];  
NSInteger year = [[dateFormatter stringFromDate:date] integerValue];    

// month
[dateFormatter setDateFormat:@"MM"];
NSInteger month = [[dateFormatter stringFromDate:date] integerValue];
...

[dateFormatter release];

Спасибо за вашу помощь!

Ответы [ 3 ]

7 голосов
/ 22 октября 2009

В этом примере нет утечки памяти. Это на 100% действительно. То, что Apple означает в документации, выглядит примерно так:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy"];
NSInteger year = [[dateFormatter stringFromDate:date] integerValue];

// new instance of NSDateFormatter without releasing the old one
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSInteger month = [[dateFormatter stringFromDate:date] integerValue];

[dateFormatter release];

Вот несколько советов по предотвращению этих ошибок:

  1. Обратите внимание при повторном использовании указателя.
  2. Всегда используйте эту конструкцию: [[[NSDateFormatter alloc] init] autorelease] или используйте элементы убедительности, такие как [NSArray arrayWithCapacity:...] Обычно это хорошая идея в Какао, поскольку накладные расходы малы. Если вы на iPhone, это имеет значение больше. Apple рекомендует вручную освобождать объекты, чтобы поддерживать мало памяти. Но, как всегда, профиль прежде чем оптимизировать.
  3. Не используйте широкие имена переменных, такие как buffer, которые вы, вероятно, будете использовать повторно.
  4. Повторное использование переменных не экономит память. Компилятор автоматически оптимизирует такие вещи.
1 голос
/ 22 октября 2009

Это выглядит хорошо. Вы вызвали alloc только один раз, чтобы создать один экземпляр NSDateFormatter, и в конце вы его отпускаете. Между ними вы объявляете отдельные NSIntegers для года и месяца и вызываете методы экземпляра для dateFormatter. Вы не переназначаете выделенную ему память с помощью setDateFormat:.

0 голосов
/ 24 октября 2009

Кроме того, функция анализа в новых версиях Xcode обнаружит «простые» утечки, подобные этой, во время компиляции.

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