Eu sou novo no Obj-C, então minha primeira pergunta é:
Quais são as diferenças entre strong
e weak
nas @property
declarações de ponteiros para objetos?
Além disso, o que nonatomic
significa?
Eu sou novo no Obj-C, então minha primeira pergunta é:
Quais são as diferenças entre strong
e weak
nas @property
declarações de ponteiros para objetos?
Além disso, o que nonatomic
significa?
Respostas:
Uma referência forte (que você utilizará na maioria dos casos) significa que você deseja "possuir" o objeto que você está referenciando com essa propriedade / variável. O compilador cuidará para que qualquer objeto que você atribuir a essa propriedade não seja destruído desde que você aponte para ele com uma referência forte. Somente quando você definir a propriedade nil
, o objeto será destruído (a menos que um ou mais outros objetos também tenham uma forte referência a ele).
Por outro lado, com uma referência fraca, você indica que não deseja ter controle sobre a vida útil do objeto. O objeto que você está referenciando fracamente vive apenas porque pelo menos um outro objeto possui uma forte referência a ele. Quando esse não for mais o caso, o objeto será destruído e sua propriedade fraca será automaticamente configurada para nil
. Os casos de uso mais frequentes de referências fracas no iOS são:
delegar propriedades, que geralmente são referenciadas de maneira fraca para evitar ciclos de retenção e
sub-visualizações / controles da visualização principal de um controlador de exibição porque essas visualizações já são fortemente mantidas pela visualização principal.
atômico x não atômico refere-se à segurança do encadeamento dos métodos getter e setter que o compilador sintetiza para a propriedade. atomic (o padrão) diz ao compilador para tornar os métodos acessadores seguros para threads (adicionando um bloqueio antes de um ivar ser acessado) e nonatomic faz o oposto. A vantagem do não-atômico é um desempenho um pouco maior. No iOS, a Apple usa não-atômico para quase todas as suas propriedades, portanto, o conselho geral é que você faça o mesmo.
atomic
garante que a propriedade possa ser lida e gravada com segurança de vários threads ao mesmo tempo. Isso não significa que um objeto cujas propriedades são todas atomic
é automaticamente seguro para threads.
Pode ser útil pensar em referências fortes e fracas em termos de balões.
Um balão não voará enquanto houver pelo menos uma pessoa segurando uma corda presa a ele. O número de pessoas que mantêm seqüências de caracteres é a contagem de retenção. Quando ninguém está segurando uma corda, o balão voa para longe (desalinhamento). Muitas pessoas podem ter cordas no mesmo balão. Você pode obter / definir propriedades e chamar métodos no objeto referenciado com referências fortes e fracas.
Uma referência forte é como segurar uma corda naquele balão. Enquanto você estiver segurando uma corda presa ao balão, ele não voará para longe.
Uma referência fraca é como olhar para o balão. Você pode vê-lo, acessar suas propriedades, chamá-lo de métodos, mas você não tem nenhuma string nesse balão. Se todo mundo segurando a corda soltar, o balão voará e você não poderá mais acessá-lo.
strong
e weak
realmente significam.
forte : atribui o valor recebido a ele, ele retém o valor recebido e libera o valor existente da variável de instância
fraco : atribuirá o valor recebido a ele sem retê-lo.
Portanto, a diferença básica é a retenção da nova variável. Geralmente você deseja retê-lo, mas há situações em que não deseja tê-lo, caso contrário, você obterá um ciclo de retenção e não poderá liberar a memória dos objetos. Por exemplo. obj1 mantém obj2 e obj2 mantém obj1. Para resolver esse tipo de situação, você usa referências fracas.
Uma resposta fictícia: -
Eu acho que a explicação é dada na resposta acima, então eu só vou lhe dizer onde usar STRONG
e onde usar WEAK
:
Uso de Weak
: -
1. Delegados 2. Tomadas 3. Subvisões 4. Controles, etc.
Uso de Strong
: -
Permanecendo em qualquer lugar que não esteja incluído WEAK
.
fortes e fracas , essas palavras-chave giram em torno de Propriedade de objeto no Objective-C
O que é propriedade de objeto?
Variáveis de ponteiro implicam propriedade dos objetos para os quais eles apontam.
Sempre que uma variável de ponteiro aponta para um objeto, esse objeto possui um proprietário e permanece ativo. Isso é conhecido como uma referência forte .
Opcionalmente, uma variável não pode se apropriar de um objeto para o qual aponta. Uma variável que não se apropria de um objeto é conhecida como referência fraca .
Procure aqui uma explicação detalhada Desmistificando a propriedade e os atributos
Aqui, a Apple Documentation explicou a diferença entre propriedade fraca e forte usando vários exemplos:
Aqui, neste blog, o autor coletou todas as propriedades no mesmo local. Isso ajudará a comparar as características das propriedades:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
forte é o padrão. Um objeto permanece "vivo" enquanto houver um forte ponteiro para ele.
fraco especifica uma referência que não mantém o objeto referenciado ativo. Uma referência fraca é definida como nula quando não há referências fortes ao objeto.
Para entender as referências Forte e Fraca, considere o exemplo abaixo, suponha que tenhamos o método nomeado como displayLocalVariable.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
No método acima, o escopo da variável myView é limitado ao método displayLocalVariable, assim que o método é concluído, a variável myView que está segurando o objeto UIView será desalocada da memória.
Agora, e se quisermos manter a variável myView ao longo do ciclo de vida do nosso controlador de exibição. Para isso, podemos criar a propriedade nomeada como nome de usuárioView, que terá forte referência à variável myView (veja @property(nonatomic,strong) UIView* usernameView;
e self.usernameView = myView;
no código abaixo), como abaixo,
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Agora, no código acima, você pode ver que o myView foi atribuído a self.usernameView e self.usernameView está tendo uma referência forte (como declaramos na interface usando @property) ao myView. Portanto, o myView não será desalocado da memória até que self.usernameView esteja ativo.
Agora, considere a atribuição de myName para dummyNameView que é uma referência fraca, self.dummyNameView = myView;
Ao contrário de referência ForteFraca manterá o myView apenas até há uma forte referência a myView. Veja o código abaixo para entender a referência fraca,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
No código acima, há uma referência fraca ao myView (ou seja, self.dummyNameView está com uma referência fraca ao myView), mas não há uma referência forte ao myView; portanto, self.dummyNameView não será capaz de manter o valor myView.
Agora, considere novamente o código abaixo,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
No código acima, self.usernameView possui uma referência Forte ao myView, portanto, self.dummyNameView agora terá um valor de myView mesmo após o término do método, já que o myView tem uma referência Forte associada a ele.
Agora, sempre que fizermos uma referência Forte a uma variável, a contagem de retenção será aumentada em um e a variável não será desalocada até que a contagem de retenção atinja 0.
Espero que isto ajude.
Forte : usado basicamente com as propriedades que usamos para obter ou enviar dados de / para outras classes. Fraco : geralmente todas as saídas, as conexões são do tipo Fraco na Interface.
Não atômico : Esse tipo de propriedades é usado em condições em que não queremos compartilhar nossa saída ou objeto em diferentes segmentos simultâneos. Em outras palavras, a instância não atômica faz com que nossas propriedades lidem com um encadeamento de cada vez. Espero que seja útil para você.