Objetivo-C declarado @ atributos de propriedade (não atômico, cópia, forte, fraco)

289

Alguém pode me explicar em detalhes quando eu deve usar cada atributo: nonatomic, copy, strong, weak, e assim por diante, para uma propriedade declarada, e explicar o que cada um faz? Algum tipo de exemplo seria ótimo também. Estou usando o ARC.

Gaurav_soni
fonte
Aqui está a resposta stackoverflow.com/a/32942413/1961064
Grigori Jlavyan
rypress.com/tutorials/objective-c/properties isso explica tudo
Deepak Thakur

Respostas:

559

Essa resposta possui vários erros e também está desatualizada. Por favor, veja outras perguntas / respostas e os comentários.


Nonatomic

nonatomicé usado para fins de multiencadeamento. Se tivermos definido o atributo não atômico no momento da declaração, qualquer outro encadeamento que deseje acessar esse objeto poderá acessá-lo e fornecer resultados com relação à multiencadeamento.

cópia de

copyé necessário quando o objeto é mutável. Use isso se você precisar do valor do objeto como está neste momento e não desejar que esse valor reflita as alterações feitas por outros proprietários do objeto. Você precisará liberar o objeto quando tiver terminado porque está mantendo a cópia.

Atribuir

Assigné um pouco o oposto de copy. Ao chamar o getter de uma assignpropriedade, ele retorna uma referência aos dados reais. Normalmente, você usa esse atributo quando possui uma propriedade do tipo primitivo (float, int, BOOL ...)

Reter

retainé necessário quando o atributo é um ponteiro para um objeto. O setter gerado por @synthesizereterá (também conhecido como adicionar uma contagem de retenção) ao objeto. Você precisará liberar o objeto quando terminar. O uso de retenção aumentará a contagem de retenção e ocupará a memória no conjunto de liberação automática.

Forte

strongé uma substituição do atributo reter, como parte da ARC (Contagem de referência automatizada do Objective-C). No código não-ARC, é apenas um sinônimo de retenção.

Este é um bom site para aprender sobre stronge weakpara o iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Fraco

weaké semelhante, strongexceto pelo fato de não aumentar a contagem de referência em 1. Ele não se torna proprietário desse objeto, mas apenas mantém uma referência a ele. Se a contagem de referência do objeto cair para 0, mesmo que você ainda esteja apontando para ele aqui, ela será desalocada da memória.

O link acima contém boas informações sobre fraco e forte.

iDhaval
fonte
1
se você estiver usando esse NSString apenas internamente nessa classe em si, do que você nem precisa de uma propriedade, basta transformá-lo em um iVar e, se você estiver usando-o em outra classe, aconselharei (cópia forte).
Ankit Srivastava
1
Está faltando a propriedade Assign.
mskw
10
nonatomicsignifica que ele não deve ser acessado simultaneamente por vários threads. O padrão é o atomicque torna o thread seguro.
Wcochran
1
É um pouco perturbador que, depois de todo esse tempo, a definição de não atômico ainda esteja errada e pareça atômica. Gostaria de saber quantas pessoas usaram isso nos últimos cinco anos e tiveram a impressão errada. O que o @wcochran disse estava correto. nonatomic significa que o acesso ao ponteiro não é tratado atomicamente e, portanto, não é seguro para threads. O benefício que eu entendo de não-atômico é que é mais leve.
John Bushnell
1
Além do comentário de @JohnBushnell, existem muitos outros erros e imprecisões nesta resposta. Também não envelheceu bem, por isso é algo histórico. Vá procurar outro lugar se você procurar uma resposta para esta pergunta.
CRD
45

nonatomic A propriedade declara que o objeto não é seguro para threads, o que significa que, se um thread diferente tentar acessar esse objeto, poderão ocorrer coisas ruins, mas isso será muito mais rápido que a propriedade atômica.

strongé usado com o ARC e basicamente ajuda você, não precisando se preocupar com a contagem de retenção de um objeto. O ARC o libera automaticamente quando você termina. O uso da palavra-chave strongsignifica que você é o proprietário do objeto.

weakpropriedade significa que você não o possui e ele apenas mantém o controle do objeto até que o objeto ao qual foi atribuído permaneça, assim que o segundo objeto é liberado, ele perde seu valor. Por exemplo. obj.a=objectB;é usado e a possui uma propriedade fraca, seu valor será válido apenas até o objeto B permanecer na memória.

copypropriedade é muito bem explicada aqui

strong,weak,retain,copy,assignsão mutuamente exclusivos, portanto você não pode usá-los em um único objeto ... leia a seção "Propriedades declaradas"

esperando que isso ajude você um pouco ...

Ankit Srivastava
fonte
por isso forte, fraco, reter, copiar, ceder mutuamente exclusivos
vinoth.kumar
nonatomicsignifica apenas que nenhuma exclusão é aplicada. Isso não significa que o acesso não é seguro para threads. Esse é um detalhe de implementação que atomicvs. nonatomicnão captura.
bbum
@bbum Você pode explicar a diferença entre sem exclusão e sem thread safe ..?
Ankit Srivastava
1
A exclusão @AnkitSrivastava ocorre quando o segmento A impede o segmento B de seguir um caminho de código. Se esse caminho de código for seguro para execução de vários encadeamentos, a exclusão não será necessária. Não é seguro para threads , o caminho do código pode gerar resultados indefinidos se A e B descerem simultaneamente. Essa exclusão pode ser usada para tornar algo seguro para o thread, mas a segurança do thread não requer execução exclusiva - não simultânea -.
bbum
17

Este link tem a quebra

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

atribuir implica __unsafe_unretained propriedade.

cópia implica __ forte propriedade, bem como o comportamento usual da semântica de cópia no setter.

reter implica __ forte propriedade.

forte implica __ forte propriedade.

unsafe_unretained implica propriedade __unsafe_unretained.

fraco implica __propriedade fraca.

Mick MacCallum
fonte
a propriedade Assign não é usada apenas para iVar e valores? Então, por que é inseguro e por que é necessário observar que não é retido?
mskw
9

Ótimas respostas! Uma coisa que eu gostaria de esclarecer mais profundamente é nonatomic/ atomic. O usuário deve entender que essa propriedade - "atomicidade" se espalha apenas na referência do atributo e não no seu conteúdo. Ou seja atomic, garantirá a atomicidade do usuário para a leitura / configuração do ponteiro e apenas o ponteiro para o atributo. Por exemplo:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

Neste caso, é garantido que o ponteiro para dictseja lido / configurado da maneira atômica por diferentes threads. MAS o dictpróprio (o dicionário dictapontando) ainda é um segmento inseguro , ou seja, todas as operações de leitura / adição ao dicionário ainda são inseguras.

Se você precisar de uma coleção segura de encadeamentos, terá uma arquitetura ruim (com mais frequência) OU um requisito real (mais raro). Se for um "requisito real" - você deve encontrar um componente de coleta seguro e seguro para roscas boas ou testadas OU estar preparado para ensaios e tribulações que escrevam o seu próprio. No último caso, veja os paradigmas "sem bloqueio" e "sem espera". Parece ciência de foguetes à primeira vista, mas poderia ajudá-lo a obter um desempenho fantástico em comparação com o "bloqueio usual".

nickolay
fonte