NSMutableArray, removeFromArray и release, почему происходит сбой?

Следующий метод используется для очистки журнала от пустых страниц в конце.

// self.pages property declaratioN, this is on the header
@property(nonatomic, retain) NSMutableArray *pages;

// method that crashes
- (void)cleanup {

    NSMutableArray *pagesToRemove = [[NSMutableArray alloc] init];
    for (int n = [self.pages count]-1; n >= 0; n--) {
        JournalPage *page = [self.pages objectAtIndex:n];
        if (![page isEmpty]) {
            break;
        } else {
            if (([self.pages count] - ([pagesToRemove count] + 1) > 2)) {
                [pagesToRemove addObject:page];
            } else {
                break;
            }               
        }

    }

    if ([pagesToRemove count] % 2 != 0) {
        [pagesToRemove removeLastObject];
    }
    [self.pages removeObjectsInArray:pagesToRemove];
    [pagesToRemove release]; // this line makes the app crash
}       

Отпускание pagesToRemove вызывает сбой. Авария также происходит, если я удаляю [pageToRemove release] и использую вместо этого autorelease, когда я выделяю / инициализирую экземпляр NSMutableArray.

Без выпуска pageToRemove код работает, но я вижу утечку, и анализатор clang тоже ее видит.
Утечка этого кода; если нет, то почему?


person nutsmuggler    schedule 20.01.2011    source источник
comment
Возможно ли, что сами страницы где-то перевыпущены? Итак, как только вы удалите их с self.pages, они по существу уничтожаются, а затем, когда PagesToRemove выпускается, они получают дополнительные сообщения о выпуске и вызывают сбой. Это было бы мое предположение, основанное исключительно на том, что здесь представлено. Итак, посмотрите, как вы создаете сами объекты страницы.   -  person Jason Coco    schedule 20.01.2011


Ответы (1)


В вашем крушителе есть опечатка:

[pageToRemove release]; // this line makes the app crash

Обратите внимание, что здесь написано pageToRemove, а не page s ToRemove. ;)

person Ryan Ballantyne    schedule 20.01.2011
comment
Вы правы, но, к сожалению, я сделал здесь опечатку, повторно установив код для stackoverflow; авария все равно произойдет. Но спасибо, сейчас редактирую, чтобы исправить ошибку - person nutsmuggler; 20.01.2011