NSMutableArray removeObjectAtIndex, вызывающий неожиданный SIGABRT - PullRequest
3 голосов
/ 09 декабря 2011

Я просмотрел многочисленные посты, в которых изложены различные способы правильного удаления объекта из массива, но я не уверен, какой метод лучше всего использовать в моем случае.Я загружаю словарь из plist, этот словарь содержит множество массивов, и эти массивы содержат другой словарь.Итак, у меня есть 3 устройства хранения, одно для хранения всего словаря, другое для массива и, наконец, словарь для хранения объекта из массива:

Заголовок:

NSMutableDictionary *questionsDictionary;
NSMutableArray *questionsArray;
NSDictionary *currentQuestion;

@property (nonatomic, retain) NSMutableDictionary *questionsDictionary;
@property (nonatomic, retain) NSMutableArray *questionsArray;
@property (nonatomic, retain) NSDictionary *currentQuestion;

ИтакМой первый вопрос заключается в том, чтобы описать вышеизложенное, являются ли (неатомарные, сохраняемые) правильные вещи для использования в следующем коде.

Далее я загружаю в свой словарь из списка:

.m:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"MultipleChoice.plist"];
self.questionsDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain];

Затем я настраиваю свой массив вопросов на основе типа, основанного на моем типе вопроса:

- (void)setupQuestionType : (NSString *)qType
{
if ([self.questionsDictionary objectForKey:qType])
{
    self.questionsArray = [self.questionsDictionary objectForKey:qType];

    [self pickRandomQuestion];
}
}

Наконец (вот где я получаю ошибку), я хочу получитьслучайный вопрос из этой категории вопросов:

// Pick a random question number based upon amount of questions
int randomQuestionNum = [[NSNumber numberWithInt:(arc4random() % [self.questionsArray count])] intValue];

// Grab the dictionary entry for that question
currentQuestion = [self.questionsArray objectAtIndex:randomQuestionNum];

// Remove the question from the available questions
[self.questionsArray removeObjectAtIndex:randomQuestionNum]; (Error here)

// Set the question text
self.question.text = [currentQuestion objectForKey:kQuestionkey];

Теперь, если я закомментирую строку removeObjectAtIndex, тогда код работает нормально, и мой вопрос отображается на экране.Это приводит меня к мысли, что это не нулевой указатель.Таким образом, логический ответ указывает на тот факт, что self.questionsArray не является NSMutableArray.Поэтому при настройке массива я попробовал следующее:

- (void)setupQuestionType : (NSString *)qType
{
if ([self.questionsDictionary objectForKey:qType])
{
    NSMutableArray *temp = (NSMutableArray *)[self.questionsDictionary objectForKey:qType];
    self.questionsArray = (NSMutableArray *)temp;

    [self pickRandomQuestion];
}
}

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

1 Ответ

4 голосов
/ 09 декабря 2011

Не вводите NSArray в NSMutableArray. Вместо этого:

NSArray *temp = [self.questionsDictionary objectForKey:qType];
self.questionsArray = [NSMutableArray arrayWithArray:temp];
// code not tested.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...