Como alguém que é novo no Objective-C, alguém pode me dar uma visão geral da retenção, atribuição, cópia e qualquer outra coisa que esteja faltando, que siga a diretiva @property? O que eles estão fazendo e por que eu gostaria de usar um sobre o outro?
ios
objective-c
iphone
memory-management
Mark Reid
fonte
fonte
Respostas:
O artigo vinculado pelo MrMage não está mais funcionando. Então, aqui está o que eu aprendi na minha (muito) curta codificação no Objective-C:
atômico vs. atômico - "atômico" é o padrão. Sempre use "não atômico". Não sei por que, mas o livro que li dizia que "raramente há uma razão" para usar "atômico". (BTW: O livro que li é o livro "Programação iOS" do BNR.)
readwrite vs. readonly - "readwrite" é o padrão. Quando você @ sintetiza, um getter e um setter serão criados para você. Se você usar "somente leitura", nenhum setter será criado. Use-o para um valor que você nunca deseja alterar após a instanciação do objeto.
reter x copiar x atribuir
fonte
atomic
é tão ruim quanto o aconselhamentononatomic
. Nenhuma das opções é a "correta"; portanto, os designers de idiomas optaram pelo mais seguro das duas soluções. De fato,nonatomic
geralmente é a melhor escolha, pois omite bloqueios de linha extremamente caros. O único motivo para usaratomic
é se sua propriedade pode ser configurada a partir de vários encadeamentos (nesse caso, sua omissão pode levar a uma liberação excessiva ou um vazamento).Antes de conhecer os atributos de @property, você deve saber qual é o uso de @property.
O @property oferece uma maneira de definir as informações que uma classe pretende encapsular. Se você declarar um objeto / variável usando @property , esse objeto / variável estará acessível para outras classes que importam sua classe.
Se você declarar um objeto usando @property no arquivo de cabeçalho, precisará sintetizá-lo usando @synthesize no arquivo de implementação. Isso torna o objeto compatível com KVC . Por padrão, o compilador sintetizará métodos de acessador para esse objeto.
Os métodos de acesso são: setter e getter.
Exemplo: .h
.m
Agora o compilador sintetizará métodos de acessador para o nome .
Lista de atributos de @property
atômico, não atômico, reter, copiar, somente leitura, escrever novamente, atribuir, forte, getter = método, setter = método, unsafe_unretained
atômico é o comportamento padrão. Se um objeto é declarado como atômico, ele se torna seguro para threads. Segura por thread significa que, por vez, apenas um thread de uma instância específica dessa classe pode ter o controle sobre esse objeto.
Se o encadeamento estiver executando o método getter, outro encadeamento não poderá executar o método setter nesse objeto. Está lento.
Por esse motivo, é mais rápido acessar uma propriedade não atômica do que uma atômica.
O método setter aumentará a contagem de retenção do objeto, para que ele ocupe memória no pool de liberação automática.
Mesmo que uma sequência mutável seja definida e alterada posteriormente, a instância captura qualquer valor que tiver no momento em que é definida. Nenhum método setter e getter será sintetizado.
agora,
O nome permanecerá inalterado.
O compilador irá gerar um getter, mas não um setter.
É o oposto de somente leitura.
Lembre-se de que reter e atribuir são basicamente intercambiáveis quando a coleta de lixo está ativada.
Ele vem com o ARC.
No caso de propriedades booleanas (propriedades que têm um valor SIM ou NÃO), é habitual que o método getter comece com a palavra "é"
O método deve terminar com dois pontos.
Uma referência insegura é semelhante a uma referência fraca, pois não mantém seu objeto relacionado ativo, mas não será definido como nulo se o objeto de destino for desalocado.
Se você precisar especificar vários atributos, basta incluí-los como uma lista separada por vírgula, assim:
fonte
@property
no arquivo de cabeçalho, precisará sintetizá-lo usando@synthesize
o arquivo de implementação." Nem sempre. Por exemplo, "Por padrão, umareadwrite
propriedade será apoiada por uma variável de instância, que será novamente sintetizada automaticamente pelo compilador". Do doc .Depois de ler muitos artigos, decidi reunir todas as informações de atributos:
Abaixo está um link para o artigo detalhado, onde você pode encontrar esses atributos.
Muito obrigado a todas as pessoas que dão as melhores respostas aqui !!
Aqui está a descrição da amostra do artigo
Exemplo:
Exemplo:
Explicar:
Suponha que exista uma propriedade de string atômica chamada "name" e, se você chamar [self setName: @ "A"] do thread A, chame [self setName: @ "B"] do thread B e chame [self name] de thread C, todas as operações em threads diferentes serão executadas em série, o que significa que, se um thread estiver executando o setter ou getter, os outros threads aguardarão. Isso torna a propriedade "nome" de leitura / gravação segura, mas se outro encadeamento D chamar [release de nome] simultaneamente, essa operação poderá causar uma falha porque não há nenhuma chamada de setter / getter envolvida aqui. O que significa que um objeto é seguro para leitura / gravação (ATOMIC), mas não é seguro para threads, pois outros threads podem enviar simultaneamente qualquer tipo de mensagem para o objeto. O desenvolvedor deve garantir a segurança do encadeamento para esses objetos.
Se a propriedade "nome" não for atômica, todos os threads no exemplo acima - A, B, C e D serão executados simultaneamente, produzindo qualquer resultado imprevisível. No caso de atômico, um de A, B ou C será executado primeiro, mas D ainda pode ser executado em paralelo.
Exemplo:
Exemplo:
Explicação forte e fraca, graças a BJ Homer :
Imagine que nosso objeto seja um cachorro e que ele queira fugir (ser desalocado). Ponteiros fortes são como uma trela no cachorro. Enquanto você tiver a trela presa ao cachorro, ele não fugirá. Se cinco pessoas prenderem a trela a um cachorro (cinco indicadores fortes para um objeto), o cão não fugirá até que todas as cinco trelas sejam separadas. Os indicadores fracos, por outro lado, são como crianças apontando para o cachorro e dizendo "Olha! Um cachorro!" Enquanto o cachorro ainda estiver na coleira, as crianças pequenas ainda poderão vê-lo e ainda apontarão para ele. Assim que todas as trelas são separadas, o cão foge, não importa quantas crianças pequenas estejam apontando para ele. Assim que o último ponteiro forte (trela) não apontar mais para um objeto, ele será desalocado e todos os ponteiros fracos serão zerados. Quando usamos fraco? O único momento em que você deseja usar fraco é se você deseja evitar reter ciclos (por exemplo, o pai retém o filho e o filho retém o pai, para que nunca seja liberado).
Exemplo:
Exemplo:
unsafe_unretained
-unsafe_unretained é um qualificador de propriedade que diz ao ARC como inserir chamadas de retenção / liberação -unsafe_unretained é a versão do ARC de assign.
Exemplo:
Exemplo:
fonte
A propriedade atômica pode ser acessada por apenas um encadeamento por vez. É thread-safe . O padrão é atômico. Observe que não há palavra-chave atômica
Não atômico significa que vários segmentos podem acessar o item. segmento inseguro
Portanto, deve-se ter muito cuidado ao usar atômica. Isso afeta o desempenho do seu código
fonte
prefiro esses links sobre propriedades no objetivo-c no iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
fonte