Управление памятью Objective-C - уверен, что я все делаю неправильно - PullRequest
2 голосов
/ 14 января 2011

Примерно через 3 часа мне наконец-то удалось устранить утечку памяти в контроллере представления. Утечка была вызвана UIPickerView, у которого в свойстве заголовка установлено свойство «сохранить».

Следующий код смог это исправить:

- (void)viewDidLoad {
    [super viewDidLoad];    
    myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease];
}

- (void)dealloc {
    [super dealloc];
    [myPicker release];
    myPicker = nil;
}

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

Я, хотя и знал, как работает объективное управление памятью С, очевидно нет ...

Почему приведенный выше код исправляет утечку памяти и как может выглядеть правильная версия кода?

-

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

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

Как сказал Кэннондейл, удаление дополнительного удержания исправляет все, и необходим только один релиз.

Ответы [ 2 ]

4 голосов
/ 14 января 2011

То, что сказала Канонада.Это должно работать:

myPicker = [[UIPickerView alloc] initWithFrame:CGRectZero];

Ваш dealloc тоже отключен.Вызов super всегда должен быть последним (подумайте об этом), и это может привести к неопределенному поведению.

- (void)dealloc {
    [myPicker release];
    myPicker = nil;
    [super dealloc];
}
4 голосов
/ 14 января 2011

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

Вы должны выполнять сохранение где-то после этого момента, если нет, то ваш [релиз myPicker] будет пытаться освободить нераспределенную память с непредсказуемыми результатами.

Что вам следует сделать, это выделитьпамять в viewDidLoad (поэтому удалите авто-релиз).Убедитесь, что вы не сохраняете объект где-либо еще и освободите myPicker из dealloc.

Кроме того ... что bbum сказал re dealloc;)

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