2010-06-24 3 views
1

Каков правильный способ сделать это?iphone - не утечка

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

Сегодня я делаю это:

Я объявляю его на .h, используя что-то вроде

NSMutableArray *myArray; 

как только приложения начинается, я объявляю его .м делать что-то вроде

myArray = [[[NSArray alloc] init] retain]; 

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

Как это решить? Это правильный способ сделать это? как вы, ребята, делаете такие вещи?

благодаря

ответ

3

alloc неявно устанавливает сохранить счетчик на 1. Отправив retain сообщений вы приращение сохранить счетчик на 2. Для того, чтобы объект, который будет освобождаться вы тогда должны отпустить его в два раза. Несоблюдение этого требования приведет к утечке памяти.

В идеале вы должны создать объект в методе init с помощью [[NSArray alloc] init], а затем отпустить его в методе dealloc так:

- (void)dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 

Вы также можете найти эту статью полезной: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Еще одна вещь : Вы объявили myArray как NSMutableArray, но создали его как NSArray. Возможно, это вызвало крах.

+0

спасибо, но скажите мне: я беру ересь за объявление массива в начале приложения и освобождение его по методу dealloc? Как я могу не использовать сохранение? Если я не сделаю, массив будет недействительным, и приложение выйдет из строя. Я попытался удалить сохранение, но приложение выйдет из строя. – SpaceDog

+1

Вы должны выпустить его где-то еще в своем коде. Убедитесь, что единственный экземпляр '[myArray release]' в вашем коде находится в вашем методе 'dealloc'. – robinjam

2

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

+0

спасибо !!!!!!!!!!! – SpaceDog

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