Objetivo C - Atribuir, Copiar, Reter


83

Sou novo no Objetivo C. Tenho conhecimento básico em C, incluindo o conceito de ponteiros. Eu tenho duas perguntas básicas:

  1. Alguém pode explicar a diferença entre atribuir, copiar e reter com alguma analogia?
  2. Como você lida com uma função que retorna uma variável de ponteiro e como você executa mensagens por meio de um ponteiro de retorno?

Respostas:


126

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 -copymensagem 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).


2
Obrigado cara eu li o básico no Apple Dev, sobre meu desenvolvimento atual. Tendo dificuldade em gerenciamento de memória "travou em objc_msgSend ()" Então, pensei em revisar meu entendimento sobre propriedades. stackoverflow.com/questions/4506205/…
Sabha B

2
Apenas para alertar, o link para a resposta leva a uma "Página não encontrada" genérica no site de maçãs. Em seguida, ele redireciona para a "Biblioteca do desenvolvedor Mac" Esta resposta do SO tem informações úteis: stackoverflow.com/questions/2255861/…
hippeelee

1
É um tipo difícil de atualizar porque a documentação mudou e não está mais em um local conveniente. Feedback enviado à equipe de doc da Apple.
Joshua Nozzi

33

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.

copy Faz uma cópia de um objeto e o retorna com a contagem retida de 1. Se você copiar um objeto, você possui a cópia. Isso se aplica a qualquer método que contenha a palavra cópia, onde “cópia” se refere ao objeto que está sendo retornado.

reter Aumenta a contagem de retenção de um objeto em 1. Obtém a propriedade de um objeto.

release Diminui a contagem de retenção de um objeto em 1. Cede a propriedade de um objeto.


Obrigado pela sua resposta. Você poderia explicar 1.ClassA tem uma propriedade chamada - (Classe B *) functionName; 2.ClassB have method - (void) setHeight; Interface 3.ClassC Eu declarei ClassA * tempA como reter. 4. Implementação da Classe C no construtor Tenho esta instrução ClassB * tempB = tempA.functionName; 5.Quando tento enviar uma mensagem (tempB. SetHeight;) na próxima linha de inicialização de tempB, meu programa funciona bem.
Sabha B

6. colocando a mesma instrução (tempB. SetHeight;) em alguma função e chamando a mesma função que meu programa travou em objc_msgSend ().
Sabha B

8
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"
)

2
Uma explicação envolvente melhoraria seriamente sua resposta.
zx485

4
  1. atribuir

    • atribuir é um atributo de propriedade padrão
    • assign é um atributo de propriedade que diz ao compilador como sintetizar a implementação do setter da propriedade
  2. cópia de:

    • a cópia é necessária quando o objeto é mutável
    • copy retorna um objeto que você deve liberar explicitamente (por exemplo, em desalocação) em ambientes sem coleta de lixo
    • você precisa liberar o objeto quando terminar com ele porque você está retendo a cópia
  3. reter:

    • especifica que o novo valor deve ser enviado “-reten” na atribuição e o valor antigo enviado “-release”
    • se você escrever, retenha funcionará automaticamente como forte
    • Métodos como “alocar” incluem um “reter” implícito
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.