Diferenças entre forte e fraco em Objective-C

308

Eu sou novo no Obj-C, então minha primeira pergunta é:

Quais são as diferenças entre stronge weaknas @propertydeclarações de ponteiros para objetos?

Além disso, o que nonatomicsignifica?

Mark Pegasov
fonte
19
na verdade, esta é uma boa pergunta, às vezes, esquecemos como o conceito básico de preferências fortes / fracos e atômicas / não-atômicas .... :) Obrigado por nos lembrar sobre isso ...
andikurnia
10
@JackyBoy O que é engraçado é que a pesquisa simples proposta no google me leva aqui, lol. #ircularreference
Jason Renaldo
10
Eu não tendem a confiar em muitas das respostas no Google, mas sempre se referem ao SO por respostas inteligentes
JeffK

Respostas:

642

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:

  1. delegar propriedades, que geralmente são referenciadas de maneira fraca para evitar ciclos de retenção e

  2. 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.

Ole Begemann
fonte
28
@ Bourne: Isso depende do que você quer dizer com segurança de thread. atomicgarante 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.
22613 Ole Begemann
3
Grandes detalhes. Eu acho que realmente não entendi até agora. Obrigado.
precisa saber é o seguinte
1
De acordo com a documentação da apple, atômica e não atômica devem ser sinônimos de segurança de threads. developer.apple.com/library/ios/documentation/cocoa/conceptual/...
Murtaza Khursheed Hussain
5
"Nota: Atomicidade de propriedade não é sinônimo de segurança de encadeamento de um objeto." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS
por que simplesmente não excluímos a instância quando não queremos? Por que não podemos simplesmente tirar o ar do balão ou destruí-lo quando não queremos, por que precisamos nos preocupar com as cordas presas? Nós apenas precisamos de dados.
Ashish Pisey 14/05/19
707

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.

MJN
fonte
68
+2 (se eu pudesse). Sério, explicação realmente criativa!
precisa saber é o seguinte
25
Depois de anos 1 e meio de iOS desenvolvimento, acho que só agora eu claramente entendido o que stronge weakrealmente significam.
Is Is
17
@ O ciclo X.Li Retain é como se você tivesse duas cordas no balão, uma delas pertence a você (então você é o proprietário deste balão) e a outra é propriedade do balão (então este balão é o seu dono). Como você só tem acesso à sua corda, como você deixa o balão ir se ele não quiser ir? Portanto, é melhor você possuir o ballon (forte) enquanto o ballon não o possui (fraco). Quando você quer deixá-lo ir, basta cortar a corda :)
snakeninny
5
Leia o perfil dele, ele é um instrutor de iOS. Explicação muito criativa !! Chapéus fora :)
Hemang
3
Atômico vs não atômico, acho que pode ser descrito como um banheiro público com várias portas, com um banheiro no centro. Quando alguém entra no banheiro por uma porta, ele pode trancar todas as outras portas no banheiro se não quiser experimentar um momento de constrangimento. Ri muito. Obrigado por ler essa analogia sem sentido.
Chen Li Yong
24

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.

Pfitz
fonte
12

Uma resposta fictícia: -

Eu acho que a explicação é dada na resposta acima, então eu só vou lhe dizer onde usar STRONGe 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.

shubham mishra
fonte
2
E o que contém etc: P
Rajneesh071 5/16
3
webView, mapView, etc
Mishra shubham
4
na verdade, a maior parte do subexibição que arrastar e soltar no storyboard
Mishra shubham
8

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.

  • Quando um método (ou função) tem uma variável local que aponta para um objeto, diz-se que essa variável é proprietária do objeto que está sendo apontado.
  • Quando um objeto tem uma variável de instância que aponta para outro objeto, diz-se que o objeto com o ponteiro é o proprietário do objeto que está sendo apontado.

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

Vinay Jain
fonte
6

Aqui, a Apple Documentation explicou a diferença entre propriedade fraca e forte usando vários exemplos:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

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

subhash kumar singh
fonte
6

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.

Ankit Vyas
fonte
2

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.

  • Referência fraca

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.

Mahadev Mandale
fonte
2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] Meu nome é = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Meu nome é forte = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] Meu nome é para fraco = ABC; neste caso, você disse que propriedade fraca não tem valor de meu nome. Mas estou recebendo o valor de meu nome como ABC para ambas as referências. ..? você pode dar uma resposta mais clara .... Agradecemos antecipadamente
Madhu_Nani
Não @Raviteja_DevObal ARC não prometem fazê-lo imediatamente (ou seja deallocate a string @ "ABC"), mas ele vai ficar deallocate com certeza mais tarde ...
Mahadev Mandale
@Raviteja_DevObal Como explicamos aqui, as strings são um mau exemplo disso. Atualizei minha resposta com o objeto UIView, espero que ajude.
Mahadev Mandale 25/07/19
1

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ê.

Joga singh
fonte