[Выпуск CFArray]: сообщение отправлено освобожденному экземпляру - PullRequest
0 голосов
/ 19 марта 2010

Я использую следующий метод в моем коде:

- (NSMutableArray *) newOrderedArray:(NSMutableArray *)array ByKey:(NSString *)key ascending:(BOOL)ascending {

    NSSortDescriptor *idDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:ascending];

    NSArray *sortDescriptors = [NSArray arrayWithObject:idDescriptor];
    NSArray *orderArray = [array sortedArrayUsingDescriptors:sortDescriptors];

    [idDescriptor release];

    NSMutableArray *result = [NSMutableArray arrayWithArray:orderArray];

    return result;
}

Это хорошо закодированный удобный метод? Как я думаю, он возвращает автоматически выпущенный NSMutableArray.

Этот метод вызывается другим:

- (id) otherMethod {

    NSMutableArray *otherResult = [[[NSMutableArray alloc] initWithCapacity:[otherArray count]] autorelease];

   // I add some stuff to otherResult and then...

    NSMutableArray *result = [dbUtils newOrderedArray:otherResult ByKey:@"objectId" ascending:NO];
    return result;
}

Этот метод (otherMethod) вызывается в каком-либо контроллере представления, где я хочу сохранить возвращенный массив и освободить его при освобождении контроллера представления. Однако когда в этом контроллере представления вызывается [result retain] (потому что мне нужно, чтобы он был доступен, и я не могу разрешить его освобождение), я получаю следующую ошибку:

[выпуск CFArray]: сообщение отправлено освобожденному экземпляру

Я пытался войти [result retainCount] непосредственно перед вызовом retain, и он вывел «1». Я не понимаю, почему возникает ошибка при вызове retain.

Спасибо,

A

Ответы [ 3 ]

0 голосов
/ 19 марта 2010

Я не вижу ничего технически неправильного с кодом выше - otherMethod должен возвращать автоматически выпущенный NSMutableArray. Вы уверены, что получаете ошибку при вызове retain? Похоже, что в какой-то момент вы случайно отправляете релиз, а не сохраняете.

Стилистически, есть одна вещь - методы с «новым» в заголовке всегда должны возвращать не -авторрелизированные объекты, поэтому вы должны либо назвать свой метод как-нибудь еще (например, orderedArray...), либо использовать [[NSMutableArray alloc] initWithArray:] вместо arrayWithArray. Кроме того, подписи методов не должны начинаться с заглавной буквы (поэтому ByKey должно быть byKey.

0 голосов
/ 19 марта 2010

initWithCapacity: не возвращает автоматически выпущенный объект. - Wevah

AFAIK initWithCapacity - это удобный инициализатор, который по соглашению возвращает автоматически выпущенные объекты. Таким образом, если объект используется только в локальном методе, autoreleasepool должен освободить его. Хотите уточнить?

0 голосов
/ 19 марта 2010

попробуйте это:

    NSMutableArray *otherResult = [[NSMutableArray initWithCapacity:[otherArray count]];

Потому что initWithCapacity вернет автоматически освобожденный массив. Прямо сейчас вы говорите Autoreleasepool освободить массив дважды.

...