Должен ли я освободить массив, возвращенный из [NSMutableDictionary ValueForKey:] - PullRequest
2 голосов
/ 29 июня 2010

У меня есть NSMutableDictionary с ключом, являющимся первым алфавитом имени объекта. Это что-то вроде вкладки «Контакты» на iphone. Дополнительно пользователь может выбрать отдельные объекты в списке.

В коде я нахожу каждый выбранный объект для дальнейшей обработки.

NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init];
NSMutableArray *array      = nil;

for (NSString *key in self.nameIndex) {

    array = (NSMutableArray *)[searchedNameDictionary valueForKey:key];    
    for (Objects *eachObject in array) {
        if (eachObject.objectIsSelected){
            [objectsToAdd addObject:eachObject];
        }
    }           
}
[array release];

-(void)dealloc()
{
    [searchedNameDictionary release];
}

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

Теперь, если в приведенном выше коде я удаляю [выпуск массива], приложение работает нормально.

Мой вопрос заключается в том, что освобождение 'массива' на самом деле освобождает объекты в искомом NameDictionary, что, как кажется, происходит.

Не приведет ли освобождение массива к утечке памяти?

Ответы [ 2 ]

5 голосов
/ 29 июня 2010

Вы не должны release возвращать объекты, если они не получены из метода alloc или copy.

Возвращенные объекты - autoreleased, в противном случае, если вы хотите оставить его вокруг, вам следует retain сразу после получения.

2 голосов
/ 29 июня 2010

array = (NSMutableArray *) [искомое имя_словия valueForKey: ключ];

Возвращает автоматически выпущенный объект, поэтому вам не нужно его освобождать.

Есть и другие ... проблемы с вашим кодом, но в основном это стиль. Избавьтесь от [релиза массива], и вы готовы пойти дальше, если вам нужна эта проблема.

...