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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top