Изменение NSMutableArray внутри цикла - PullRequest
0 голосов
/ 20 января 2012

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

    NSMutableArray *allTasks = (NSMutableArray *)[[TaskStore defaultStore] allTasks];

    NSMutableArray *completedTasks;

    for (Task *task in allTasks) {
        if ([task completed]) {
            [completedTasks addObject:task];
        }
    }

    [allTasks removeObjectsInArray:completedTasks];

Во время отладки я заметил, что массив completedTasks всегда пуст.Почему это?

Ответы [ 4 ]

2 голосов
/ 20 января 2012

Вы забыли инициализировать выполненные задачи:

NSMutableArray *completedTasks = [NSMutableArray array];
0 голосов
/ 20 января 2012

из документации NSMutableArray:

Этот метод предполагает, что все элементы в otherArray отвечают на хэш и isEqual:.

Вы можете попробовать:

 [allTasks filterUsingPredicate:[NSPredicate predicateWithFormat:@"completed = %@", [NSNumber numberWithBool:YES]]]
0 голосов
/ 20 января 2012

Вы не инициализировали завершенные задачи.Вы должны добавить это:

NSMutableArray *completedTasks = [[NSMutableArray alloc] init];
0 голосов
/ 20 января 2012

Вы должны инициализировать массив, прежде чем сможете его использовать, инициализация фактически создает ваш объект массива -

Чтобы сделать это, добавьте эту строку, чтобы создать автоматически выпущенный массив (что означает, что вам не нужно его освобождать)

NSMutableArray *completedTasks = [NSMutableArray array];

Или

 NSMutableArray *completedTasks = [[NSMutableArray alloc] init];

Но тогда вам придется отпустить его самостоятельно [completedTasks release], если вы не используете его вообще (кроме случаев, когда используете ARC).

Это создаст ваш объект массива.

Shani

...