Как мне создать свежий NSMutableArray? - PullRequest
1 голос
/ 25 января 2011

У меня есть NSMutableArray, который длится только во время сеанса. В настоящее время я создаю это так

NSMutableArray *temp = [[NSMutableArray alloc] initWithCapacity:10];
    [self setScoreArray:temp];
    [temp release];

Проблема в том, что когда я проверяю каждый индекс, я получаю ошибку outbbounds массива

NSNumber *previousScore = [[self scoreArray] objectAtIndex:[self quizNum]];
    if ( previousScore != nil ) 
    {
        [self clearQuizBtns];
        NSInteger previousScoreValue = [previousScore integerValue];
        [self selectButtonAtTag:previousScoreValue];
    }else {
        [self clearQuizBtns];
    }

В других сообщениях я читал, что initWithCapacity на самом деле не создает массив. Итак, чем я могу заполнить массив изначально? Заранее спасибо.

Ответы [ 5 ]

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

Два способа:

first : инициировать массив со значениями по умолчанию NSNull class

NSMutableArray *temp = [[NSMutableArray alloc] initWithCapacity:10];
for (int i = 0 ; i < 10 ; i++)
{
    [temp insertObject:[NSNull null] atIndex:i];
}

[self setScoreArray:temp];
[temp release];

, а затем проверить: если объект является своего рода классом NSNull, значит, он никогда не был установлен до

id previousScore = [[self scoreArray] objectAtIndex:[self quizNum]];
if (![previousScore isKindOfClass:[NSNull class]]) 
{
    [self clearQuizBtns];
    NSInteger previousScoreValue = [(NSNumber *)previousScore integerValue];
    [self selectButtonAtTag:previousScoreValue];
}else {
    [self clearQuizBtns];
}

секунда : сохранить результаты в NSMutableDictionary и использовать NSNumber в качестве ключей

// scoreDictionary property of NSMutableDictionary class must be declared in self

NSNumber *previousScore = [self.scoreDictionary objectForKey:[NSNumber numberWithInt:[self quizNum]]];
if (previousScore != nil) 
{
    [self clearQuizBtns];
    NSInteger previousScoreValue = [previousScore integerValue];
    [self selectButtonAtTag:previousScoreValue];
}else {
    [self clearQuizBtns];
}
2 голосов
/ 25 января 2011

NSArray не поддерживает «дыры».Емкость - это всего лишь подсказка инициализатору.

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

2 голосов
/ 25 января 2011

Похоже, ваша проблема в том, что вы никогда не устанавливаете какой-либо счет в массиве очков ... а вы? NSArrays имеет фактические count элементов в них, и доступ к индексу, превышающему это количество, взорвется, как вы видели. Если будет когда-либо только фиксированное (небольшое) количество баллов, например, 10, то вы могли бы изначально установить для них все значение по умолчанию:

for (int i = 0; i < 10; i++) {
    [temp addObject:[NSNumber numberWithInt:0]];
}

P.S. -initWithCapacity создает «массив», просто не создает никаких объектов в массиве. Емкость только подсказка.

0 голосов
/ 25 января 2011

Отличная особенность NSMutableArrays в том, что вы можете просто выполнить init, и массив будет обрабатывать добавление и удаление объектов на лету. Помните, что вы обычно добавляетеObject: или removeObjectAtIndex: при работе с изменяемыми массивами.

0 голосов
/ 25 января 2011

Используя arrayWithObject: или arrayWithObjects: методы могут предоставить массив с предварительно заполненными значениями.

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