Невозможно сбросить NSArray и NSMutableArray в Objective-C - PullRequest
2 голосов
/ 03 октября 2011

Я создаю NSMutableArray следующим образом (обратите внимание, что winner является переменной экземпляра):

winner = [NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil];

Когда я устанавливаю winner в nil или удаляю его объекты, такие как

[self.winner removeAllObjects];

моя программа автоматически выключится.Как мне решить эту проблему?

Обновлено !!!В случае, если я напишу такой код

self.winner = [NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil];

, он вызовет метод установки, который будет

- (void)setWinner:(NSMutableArray *)newWinner
{
    [winner release];
    winner = [newWinner retain];
}

Нужно ли мне сохранять массив как

self.winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];

Ответы [ 4 ]

3 голосов
/ 03 октября 2011

Вы звоните -removeAllObjects другим методом?Если это так, то, скорее всего, проблема в том, что вам не удалось сохранить массив, и он был уничтожен между назначением и вашей последующей ссылкой.+arrayWithObjects возвращает экземпляр, для которого autorelease был вызван.

Либо используйте синтезированное свойство для установки переменной экземпляра, либо используйте метод, который возвращает владение объектом (например, +alloc), либо добавьте вызов retain:

winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];
1 голос
/ 03 октября 2011

Вы назначили автоматически выпущенную ссылку на переменную экземпляра, поэтому она освобождается после цикла события. Просто сохраните его после создания:

winner = [[NSMutableArray arrayWithObjects:@"11", @"12", @"13", nil] retain];
1 голос
/ 03 октября 2011

Вы не выделили массив

ТАК,

winner = [[NSMutableArray alloc] initWithArray:@"11", @"12", @"13", nil];
0 голосов
/ 03 октября 2011

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

...