Existem dois novos atributos de gerenciamento de memória para propriedades introduzidas pelo ARC strong
e weak
.
Além de copy
, o que obviamente é algo completamente diferente, existem diferenças entre strong
vs retain
e weak
vs assign
?
Pelo meu entendimento, a única diferença aqui é que weak
será atribuída nil
ao ponteiro, enquanto assign
não será, o que significa que o programa falhará quando eu enviar uma mensagem ao ponteiro depois que ele for lançado. Mas se eu usar weak
, isso nunca acontecerá, porque o envio de mensagens para nil
não fará nada.
Eu não sei sobre nenhuma diferença entre strong
e retain
.
Existe alguma razão pela qual devo usar assign
e retain
em novos projetos ou o tipo de depreciação?
ios
objective-c
ios5
properties
automatic-ref-counting
Jakub Arnold
fonte
fonte
strong
,weak
eunsafe_unretained
.weak
estrong
) e 4 qualificadores vida variáveis (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Veja as notas do ARC abaixo.assign
ao compilar com o ARC era um erro. Existem muitas respostas excluídas sobre isso. Parece que foi alterado antes do lançamento final.unsafe_unretained
é o atributo preferido para muitos de nós que adotamos cedo. Para provar queunsafe_unretained
é um atributo válido, consulte "Programação com objetivo-C" da Apple, na seção "Encapsulando dados", na sub-rubrica "Use referências não seguras e não retidas para algumas classes". O que diz: "Para uma propriedade, isso significa usar o atributo unsafe_unretained:"Respostas:
Das notas de versão Transição para ARC (o exemplo na seção sobre atributos de propriedade).
Assim
strong
é o mesmo queretain
em uma declaração de propriedade.Para projetos ARC que eu usaria em
strong
vez deretain
, usariaassign
para propriedades primitivas C eweak
para referências fracas a objetos Objective-C.fonte
assign
para um objeto. Você precisa usar umweak
ouunsafe_unretained
(o que é inseguro, obviamente) se não quiser reter a propriedade.assign
compila muito bem para mim em projetos ARC com o destino de implantação 4.0.retain
vsstrong
. Suponho que isso seja inofensivo, mas imagino que sejastrong
por consistência ... ou talvez não importe. stackoverflow.com/questions/7796476/…assign
ainda é válido em alguns casos.Depois de ler tantos artigos, publicações do Stackoverflow e aplicativos de demonstração para verificar atributos de propriedades variáveis, decidi reunir todas as informações de atributos:
Abaixo está o link detalhado do artigo, onde você pode encontrar todos os atributos mencionados acima, que definitivamente o ajudarão. Muito obrigado a todas as pessoas que dão as melhores respostas aqui !!
1. forte (iOS4 = reter)
Exemplo:
2.weak -
Exemplo:
Explicação forte e fraca, graças a BJ Homer :
Quando usamos fraco?
O único momento em que você gostaria de usar fraco é se você queria evitar manter ciclos (por exemplo, o pai retém o filho e o filho retém o pai, para que nunca seja liberado).
3. reter = forte
Exemplo:
4. atribuir
Exemplo:
fonte
default
significa? Se eu usar@property (nonatomic) NSString *string
éstrong
? Ouassign
? Porque ambos são padrões.não atômico / atômico
forte / fraco / atribuir
(Opcional)
cópia de
somente leitura
fonte
Tanto quanto eu sei,
strong
eretain
são sinônimos, então eles fazem exatamente o mesmo.Então,
weak
é quase comoassign
, mas automaticamente definido como nulo, depois que o objeto, para o qual está apontando, é desalocado.Isso significa que você pode simplesmente substituí-los.
No entanto , há um caso especial que encontrei, onde tive que usar
assign
, e nãoweak
. Digamos que temos duas propriedadesdelegateAssign
edelegateWeak
. Nos dois está armazenado nosso delegado, que está nos possuindo por ter a única referência forte. O delegado está desalocando, então nosso-dealloc
método também é chamado.O delegado já está em processo de desalocação, mas ainda não está totalmente desalocado. O problema é que as
weak
referências a ele já estão anuladas! A propriedadedelegateWeak
contém nulo, masdelegateAssign
contém um objeto válido (com todas as propriedades já liberadas e anuladas, mas ainda válidas).É um caso bastante especial, mas nos revela como essas
weak
variáveis funcionam e quando são anuladas.fonte
Documento de Clang sobre a contagem automática de referência Objective-C (ARC) explica claramente os qualificadores e modificadores de propriedade:
Existem seis modificadores de propriedade para a propriedade declarada:
Em termos semânticos, os qualificadores de propriedade têm um significado diferente nas cinco operações gerenciadas : Leitura, Designação, Inicialização, Destruição e Movimentação, nas quais na maioria das vezes nos preocupamos apenas com a diferença na operação de Designação.
A outra diferença em Leitura, Inicialização, Destruição e Movimentação, consulte a Seção 4.2 Semântica no documento .
fonte
Para entender as referências Forte e Fraca, considere o exemplo abaixo, suponha que tenhamos o método nomeado como displayLocalVariable.
No método acima, o escopo da variável myName é limitado ao método displayLocalVariable, assim que o método for concluído, a variável myName, que contém a string "ABC", será desalocada da memória.
Agora, e se quisermos manter o valor da variável myName durante todo o ciclo de vida do controlador de exibição. Para isso, podemos criar a propriedade nomeada como nome de usuário, que terá forte referência à variável myName (veja o
self.username = myName;
código abaixo), como abaixo,Agora, no código acima, você pode ver que myName foi atribuído a self.username e self.username está tendo uma forte referência (como declaramos na interface usando @property) a myName (indiretamente, está tendo forte referência à cadeia "ABC"). Portanto, String myName não será desalocada da memória até que self.username esteja ativo.
Agora considere atribuir myName a dummyName, que é uma referência fraca, self.dummyName = myName; Diferentemente da referência Forte, Fraco manterá o meuNome apenas até que haja uma referência Forte ao meuNome. Veja o código abaixo para entender a referência fraca,
No código acima, há uma referência fraca a meu nome (ou seja, self.dummyName está com uma referência fraca a meu nome), mas não há uma referência forte a meu nome, portanto, self.dummyName não poderá manter o valor de meu nome.
Agora, considere novamente o código abaixo,
No código acima, self.username possui uma forte referência a myName; portanto, self.dummyName agora terá um valor de myName mesmo depois que o método termina, já que myName tem uma referência forte associada a ele.
Agora, sempre que fizermos uma referência Forte a uma variável, a contagem de retenções será aumentada em um e a variável não será desalocada.
Espero que isto ajude.
fonte
Forte:
Exemplo: @property (forte, não atômico) ViewController * viewController;
@synthesize viewController;
Fraco
Por padrão, obtém e define automaticamente como nulo
Exemplo: @property (fraco, não atômico) IBOutlet UIButton * myButton;
@synthesize myButton;
fonte
As diferenças entre forte e reter:
As diferenças entre fraco e atribuir:
fonte