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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
fonte
fonte
Respostas:
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 decopy
. Ao chamar o getter de umaassign
propriedade, 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@synthesize
reterá (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
strong
eweak
para o iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Fraco
weak
é semelhante,strong
exceto 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.
fonte
nonatomic
significa que ele não deve ser acessado simultaneamente por vários threads. O padrão é oatomic
que torna o thread seguro.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-chavestrong
significa que você é o proprietário do objeto.weak
propriedade 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.copy
propriedade é muito bem explicada aquistrong,weak,retain,copy,assign
sã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 ...
fonte
nonatomic
significa apenas que nenhuma exclusão é aplicada. Isso não significa que o acesso não é seguro para threads. Esse é um detalhe de implementação queatomic
vs.nonatomic
não captura.Este link tem a quebra
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
fonte
Ó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 sejaatomic
, garantirá a atomicidade do usuário para a leitura / configuração do ponteiro e apenas o ponteiro para o atributo. Por exemplo:Neste caso, é garantido que o ponteiro para
dict
seja lido / configurado da maneira atômica por diferentes threads. MAS odict
próprio (o dicionáriodict
apontando) 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".
fonte