Resposta atualizada para documentação alterada
As informações agora estão espalhadas por vários guias na documentação. Aqui está uma lista de leituras obrigatórias:
A resposta a esta pergunta agora depende inteiramente se você está usando um aplicativo gerenciado por ARC (o padrão moderno para novos projetos) ou forçando o gerenciamento de memória manual.
Atribuir vs. Fraco - Use atribuir para definir o ponteiro de uma propriedade para o endereço do objeto sem retê-lo ou curá-lo de outra forma; use fraco para que a propriedade aponte para zero automaticamente se o objeto atribuído a ela for desalocado. Na maioria dos casos, você desejará usar o fraco para não tentar acessar um objeto desalocado (acesso ilegal de um endereço de memória - " EXC_BAD_ACCESS
") se você não realizar a limpeza adequada.
Reter vs. Copiar - as propriedades declaradas usam reter por padrão (portanto, você pode simplesmente omiti-lo por completo) e gerenciará a contagem de referência do objeto automaticamente se outro objeto for atribuído à propriedade ou estiver definido como nulo; Use a cópia para enviar automaticamente uma -copy
mensagem ao objeto recém-atribuído (o que criará uma cópia do objeto passado e atribuirá essa cópia à propriedade - útil (até mesmo obrigatório) em algumas situações em que o objeto atribuído pode ser modificado após ser definido como uma propriedade de algum outro objeto (o que significaria que a modificação / mutação se aplicaria à propriedade também).
O Guia de Programação de Gerenciamento de Memória da Biblioteca de Referência do iOS tem noções básicas de atribuição, cópia e retenção com analogias e exemplos.
fonte
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil]; NSMutableArray *copiedArray = [array mutableCopy]; NSMutableArray *retainedArray = [array retain]; [retainedArray addObject:@"Retained Third"]; [copiedArray addObject:@"Copied Third"]; NSLog(@"array = %@",array); NSLog(@"Retained Array = %@",retainedArray); NSLog(@"Copied Array = %@",copiedArray); array = ( First, Second, "Retained Third" ) Retained Array = ( First, Second, "Retained Third" ) Copied Array = ( First, Second, "Copied Third" )
fonte
atribuir
cópia de:
reter:
fonte