Quando liberar um objeto adicionado a um nsmutabledictionário
-
21-09-2019 - |
Pergunta
Estou trabalhando em um aplicativo para iPhone que construirá, em tempo de execução, um nsmutabledictionary para o qual os valores (dos pares de valor-chave) serão NSMutablearRays. Sendo um pouco novo no Objective-C, estou preocupado que o seguinte causa um vazamento de memória:
- (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];
}
}
O SupplierPhotos é um NSMutabledictionary, que é uma variável de membro da classe que contém.
Como você pode ver, quando estou aceitando um novo UIImage* para colocar na estrutura, verifico primeiro se o objeto no par de valores-chave correspondente ao segundo argumento (fornecedor) é nulo. Se for nulo, aloço um novo NSMutableArray e o defino como o objeto para essa chave e depois a soltei. Supondo que eu negociei o nsmutabledictionary no Dealloc da classe que contém esse método, as referências serão divulgadas? Antes de negociar o nsmutabledictionary, preciso atravessá-lo e negociar os nsmutablearrays individuais contidos?
Obrigado,
Ben B.
Solução
Quando você adiciona objetos em um contêiner como dicionário ou matriz, a retenção será invocada automaticamente e, quando você liberar o contêiner como sua pergunta, é dicionário, ele chamará de 'liberação' de todos os objetos para demitir a memória do objeto.
Outras dicas
Esse gerenciamento de memória parece correto para mim. Você libera a cópia que você alocou e a matriz mantém outra referência depois de adicionar a ela, para que a contagem da rede seja 1, que está correta.