Когда освобождать объект, добавленный в NSMutableDictionary - PullRequest
2 голосов
/ 18 января 2010

Я работаю над приложением для iPhone, которое во время выполнения создаст NSMutableDictionary, для которого значения (из пар ключ-значение) будут NSMutableArrays. Будучи новичком в Objective-C, я обеспокоен тем, что следующее может вызвать утечку памяти:

- (void) addNewSupplierPhoto:(UIImage*)image toSupplierID:(NSInteger*) supplierID{
NSMutableArray* supplierPhotoArray = [supplierPhotos objectForKey:supplierID];
if(supplierPhotoArray == nil)
{
    supplierPhotoArray = [[NSMutableArray alloc] init];
    [supplierPhotos setObject:supplierPhotoArray forKey:supplierID];
    [supplierPhotoArray release];
}
}

supplierPhotos - это NSMutableDictionary, который является переменной-членом содержащего класса.

Как вы видите, когда я принимаю новый UIImage * для помещения в структуру, я сначала проверяю, является ли объект в паре ключ-значение, соответствующий второму аргументу (supplierID), нулем. Если это ноль, я выделяю новый NSMutableArray и устанавливаю его в качестве объекта для этого ключа, а затем освобождаю его. Предполагая, что я освобождаю NSMutableDictionary в dealloc класса, содержащего этот метод, ссылки будут освобождены? Прежде чем освободить NSMutableDictionary, нужно ли пройти через него и освободить отдельные NSMutableArrays, содержащиеся в?

Спасибо

Бен Б.

Ответы [ 2 ]

5 голосов
/ 21 февраля 2010

когда вы добавляете объекты в контейнер, такой как словарь или массив, функция retain будет вызываться автоматически, а когда вы освобождаете контейнер в качестве вашего вопроса как словаря, он вызывает 'release' каждого объекта для освобождения памяти объекта.

0 голосов
/ 18 января 2010

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

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