Нужно ли выпускать скопированные объекты NSO - Objective-c - PullRequest
14 голосов
/ 12 марта 2010

Мне было интересно, нужно ли мне выпускать скопированный объект NSObject? Например, я создаю только один словарь, который копирую в массив:

Код:

for (int num = 0; num < [object count]; num++) {
    [dictionary setObject:[object objectAtIndex:num] forKey:@"x"];
    [array addObject:[dictionary copy]];
}

Должен ли я выпустить словарь? Если да, то когда?

Спасибо

Ответы [ 4 ]

24 голосов
/ 12 марта 2010

Да, вы делаете. В этом случае вам, вероятно, следует выпустить копию сразу же после добавления ее в массив, поскольку массив сохраняет все, что было добавлено к ней:

 NSDictionary *copied = [dictionary copy];
 [array addObject:copied];
 [copied release];
5 голосов
/ 12 марта 2010

Этот фрагмент из документации:

- (id) копия

Возвращаемое значение Объект, возвращаемый методом протокола NSCopying copyWithZone :, где зона равна nil.

Обсуждение Это удобный метод для классов, которые принимают протокол NSCopying. Возникает исключение, если для copyWithZone нет реализации:.

NSObject не поддерживает сам протокол NSCopying. Подклассы должны поддерживать протокол и реализовывать метод copyWithZone:. Версия подкласса copyWithZone: метод должна отправлять сообщение супер сначала, чтобы включить его реализацию, если только подкласс не происходит напрямую от NSObject.

Особые соображения Если вы используете управляемую память (не сборщик мусора), этот метод сохраняет новый объект перед его возвратом. Ответственный за метод, однако, ответственен за освобождение возвращенного объекта.

2 голосов
/ 12 марта 2010

С copy вы вступаете во владение возвращенным объектом. Контейнеры также получают право собственности на добавленные к ним объекты.
В результате вы должны отказаться от права собственности на копию, как указал Ной. Рекомендации по управлению памятью какао содержат раздел, в котором отмечается , как работать с контейнерами .

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

Трудно сказать, не видя, где вы создаете словарь, разумно ли это в любом случае. Если в словаре нет других членов, было бы проще (хотя и труднее читать :) сделать что-то вроде

for (int num = 0; num < [object count]; num++) {
    [array addObject:[NSDictionary
                           dictionaryWithObject:[object objectAtIndex:num]
                                        forKey:@"x"
                     ]
    ]
}

Это даст вам реальные объекты NSDictionary в вашем массиве, а не копии NSMutableDictionary, которые вы создаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...