Выпуск памяти iPhone - PullRequest
       14

Выпуск памяти iPhone

2 голосов
/ 11 января 2010

У меня есть некоторые сомнения относительно функции dealloc в программе iPhone. Требуется ли дать [выпуск self.object_name] или [выпуск object_name] в порядке? .. У меня странная проблема в моей функции dealloc:

-(void) dealloc {
   [self.listOfDates release];
   [self.listOfDescriptions release];
   [super dealloc];
 }

Но программа падает, давая EXEC_BAD_ACCESS. Здесь оба объекта являются экземплярами NSMutableArray, выделенными с помощью alloc в функции init для класса. Та же функция без самоотдачи работает нормально, т.е.

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

Вот как я объявил собственность

@property (nonatomic,retain) NSMutableArray *listOfDates;
@property (nonatomic,retain) NSMutableArray *listOfDescription;

В файле реализации я систематизировал это, и внутри функции init я выделил эти переменные следующим образом

self.listOfDates = [[NSMutableArray alloc] init];
self.listOfDescription = [[NSMutableArray alloc] init];

Так нужно ли отдавать себя? Что мне здесь не хватает?

Проблема устранена, когда я удалил функцию mutableCopy, которую я использовал для копирования экземпляра NSMutableArrays, которые были переданы в качестве аргумента функции init, как показано ниже

-(id)initWithDate:(NSMutableArray *)dates andDescription:(NSMutableArray*)descriptions
{
    if(self = [super initWithNibName:@"DateDescriptionControl" bundle:nil])
    {
        self.listOfDates = [[NSMutableArray alloc] init];
        self.listOfDescription = [[NSMutableArray alloc] init];

        self.listOfDates = [dates mutableCopy];
        self.listOfDescription = [description mutableCopy]; 

    }

   return self;
}

После удаления mutableCopy, сделка теперь не генерирует EXEC_BAD_ACCESS. Так, где я сделал ошибку, я все еще не могу понять: (

Ответы [ 7 ]

2 голосов
/ 11 января 2010

В dealloc у вас есть два варианта:

[foobar release];

или

self.foobar = nil;

Второй эквивалентен записи [self setFoobar:nil], и он находится внутри setFoobar: метод - это место, где высвобождается предыдущее значение (при условии, что свойство было определено как использование retain или copy). Я обычно предпочитаю первую форму, где вы просто отправляете release непосредственно на объект, но любая из них подойдет.

Написание [self.foobar release] технически должно быть в порядке, хотя если позже вы вызовете self.foobar = nil, объект будет освобожден во второй раз (и вызовет EXC_BAD_ACCESS).

2 голосов
/ 11 января 2010

self не требуется для освобождения в функции dealloc.

0 голосов
/ 17 июня 2013

Лучшая практика (не ARC). В вашем интерфейсе объявите Varibal, как показано ниже

NSMutableArray *_listOfDates;
NSMutableArray *_listOfDescription;

А ваши сеттеры должны быть ниже. (так же, как ваш код)

@property (nonatomic,retain) NSMutableArray *listOfDates;
@property (nonatomic,retain) NSMutableArray *listOfDescription;

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

@synthesize listOfDates = _listOfDates, listOfDescription = _listOfDescription;

В инициализации

-(id)initWithDate:(NSMutableArray *)dates andDescription:(NSMutableArray*)descriptions
{
    if(self = [super initWithNibName:@"DateDescriptionControl" bundle:nil])
    {
        NSMutableArray *tempListOfDates = [[NSMutableArray alloc] init];
        self.listOfDates = tempListOfDates;
        [tempListOfDates release];

        NSMutableArray *tempListOfDescription = [[NSMutableArray alloc] init];
        self.listOfDescription = tempListOfDescription;
        [tempListOfDescription release];
    }
}

в сделке

-(void) dealloc {
    [_listOfDates release];
    [_listOfDescription release];
    [super dealloc];
 }
0 голосов
/ 17 июня 2013

Основная проблема, с которой вы столкнулись, вызвана этим кодом:

self.listOfDates = [[NSMutableArray alloc] init];

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

self.listOfDates = [[[NSMutableArray alloc] init] autorelease];

Но это довольно уродливо, и NSMutableArray предоставляет хороший конструктор, который делает это автоматически:

self.listOfDates = [NSMutableArray array];

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

0 голосов
/ 11 января 2010

Просто используйте [выпуск объекта], чтобы освободить переменную экземпляра. Использовать «self» не обязательно.

0 голосов
/ 11 января 2010

да,

[освобождение объекта];

должно работать нормально.

0 голосов
/ 11 января 2010

self.something означает [self something], поскольку точка означает синтаксис свойства. То, что вы хотите, это self->something.

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