2010-01-18 3 views
2

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

- (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 * для ввода в структуру, я сначала проверяю, является ли объект в паре ключа-значения, соответствующий второму аргументу (vendIDID) равным нулю. Если он равен нулю, я выделяю новый NSMutableArray и устанавливаю его как объект для этого ключа, а затем отпускаю его. Предполагая, что я освобожу NSMutableDictionary в dealloc класса, содержащего этот метод, будут ли ссылки выпущены? Прежде чем освобождать NSMutableDictionary, мне нужно выполнить его и удалить все содержащиеся в нем NSMutableArrays?

Спасибо,

Бен Б.

+0

Я должен добавить, для полноты, что метод не является полным; Я просто демонстрирую свой метод создания NSMutableArrays. –

ответ

5

При добавлении объектов в контейнер, например словарь или массив, сохранение будет вызываться автоматически, а когда вы отпустите контейнер в качестве своего словарного словаря, он будет вызывать «выпуск» каждого объекта, чтобы освободить память объекта.

0

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

+0

Спасибо, Даррен. Нужно ли мне ходить в NSMutableDictionary и выпускать каждый NSMutableArray внутри, прежде чем я выпущу NSMutableDictionary? –

+0

Я бы посмотрел документы NSDictionary ref, но я почти уверен, что когда NSArray или NSDictionary выпущен, он отправляет сообщения о выпуске каждому из элементов, которые он удерживает. –

+0

Элемент меню «сборка и анализ» в xCode делает довольно приличную работу, выделяя потенциальные утечки памяти, когда вы сомневаетесь. – wkw