Мне нужно выпустить скопированные NSObjects - Objective-c

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

код:

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

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

Спасибо

Ответы

Ответ 1

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

 NSDictionary *copied = [dictionary copy];
 [array addObject:copied];
 [copied release];

Ответ 2

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

- (id) copy

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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