Сделайте я должен выпустить скопированный NSObjects - Цель-c

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

Код:

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

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

Спасибо

14
задан Georg Fritzsche 12 March 2010 в 01:24
поделиться

4 ответа

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

 NSDictionary *copied = [dictionary copy];
 [array addObject:copied];
 [copied release];
24
ответ дан 1 December 2019 в 08:52
поделиться

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

2
ответ дан 1 December 2019 в 08:52
поделиться

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

- (id) copy

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

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

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

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

5
ответ дан 1 December 2019 в 08:52
поделиться

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

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

Thats даст вам настоящие объекты NSDictionary в вашем массиве, а не NSMutableDictionary копии, которые вы создаете.

0
ответ дан 1 December 2019 в 08:52
поделиться