Eu sou novo no desenvolvimento de iOS5 e uso o objetivo-c. Tenho dificuldade em entender a diferença entre armazenamento forte e fraco . Eu li a documentação e outras perguntas do SO, mas todas parecem idênticas para mim, sem nenhuma percepção adicional.
Eu li a documentação: Transitioning para ARC - faz referência aos termos de retenção, atribuição e liberação do iOS4; o que me confunde. Em seguida, analiso o Open U CS193p, onde diferencia forte e fraco:
Forte : "mantenha isso na pilha até que eu não aponte mais para ele"
Fraco : "mantenha enquanto alguém apontar fortemente"
As duas definições não são idênticas = se o ponteiro não estiver mais apontando para um objeto, então libere a memória que contém o objeto? Eu entendo o conceito de ponteiros, heap, alocação ou desalocação de memória - mas qual é a diferença entre forte e fraco?
Respostas:
A diferença é que um objeto será desalocado assim que não houver indicadores fortes para ele. Mesmo se os ponteiros fracos apontarem para ele, assim que o último ponteiro forte for eliminado, o objeto será desalocado e todos os ponteiros fracos restantes serão zerados.
Talvez seja necessário um exemplo.
Imagine que nosso objeto é um cachorro e que o cachorro quer fugir (ser desalocado).
Dicas fortes são como uma coleira no cão. Contanto que você tenha a guia presa ao cão, o cão não fugirá. Se cinco pessoas prenderem a coleira em um cão (cinco pontas fortes em um objeto), o cão não fugirá até que todas as cinco coleiras sejam retiradas.
Os ponteiros fracos, por outro lado, são como crianças apontando para o cachorro e dizendo "Olhe! Um cachorro!" Enquanto o cachorro ainda estiver na coleira, as crianças pequenas ainda podem ver o cachorro e ainda apontam para ele. Assim que todas as coleiras são retiradas, porém, o cão foge, não importa quantas crianças apontem para ele.
Assim que o último ponteiro forte (leash) não apontar mais para um objeto, o objeto será desalocado e todos os ponteiros fracos serão zerados.
fonte
Absolutamente não. A principal diferença nas duas definições que você apontou é "enquanto outra pessoa". É a "outra pessoa" que é importante.
Considere o seguinte:
Agora temos dois indicadores para
<some_object>
, um forte e outro fraco. Se colocarmosstrongObject
anil
assim:Então, se você seguir as regras que descreveu, você se perguntará o seguinte:
Forte: "mantenha isso na pilha até que eu não aponte mais para ele"
strongObject
não aponta para<some_object>
mais nada. Portanto, não precisamos mantê-lo.Fraco: "mantenha isto enquanto alguém apontar fortemente"
weakObject
ainda aponta para<some_object>
. Mas, como ninguém mais aponta para ela, essa regra também significa que não precisamos mantê-la.O resultado é que
<some_object>
é desalocado e se o seu tempo de execução oferecer suporte (Lion e iOS 5 ou superior),weakObject
será automaticamente definido comonil
.Agora, considere o que acontece se definir
weakObject
anil
assim:Então, se você seguir as regras que descreveu, você se perguntará o seguinte:
Forte: "mantenha isso na pilha até que eu não aponte mais para ele"
strongObject
aponta para<some_object>
. Portanto, precisamos mantê-lo.Fraco: "mantenha isto enquanto alguém apontar fortemente"
weakObject
não aponta para<some_object>
.O resultado é que não
<some_object>
é desalocado, mas será o ponteiro.weakObject
nil
[Observe que tudo o que está assumindo
<some_object>
não é apontado por outra referência forte em algum outro lugar / algum outro meio de ser "mantido"]fonte
UIApplication
objeto? Isso será fortemente referenciado pelo funcionamento interno deUIKit
- mas você não precisa se preocupar com isso.Forte
Fraco
fonte
Outro exemplo: Aluno é um
Object
, suposto que pode graduar-se (deallocate
) desde que tenha concluído todos os cursos básicos (strong pointers
), independentemente de cursar cursos opcionais (weak pointers
). Em outras palavras: o ponteiro forte é o único fator de desalocação dissoObject
.fonte
Não, eles não são idênticos, mas muito diferentes. Você usa forte apenas se precisar reter o objeto. Você usa fraco em qualquer outro caso, com a vantagem de saber se o objeto foi removido do heap porque ninguém o está retendo.
fonte
Sei que estou um pouco atrasado para esta festa, mas acho importante confundir a questão apontando que o significado de "modelos de memória fortes e fracos" depende se você está falando sobre software ou hardware.
Para hardware, fraco ou forte indica se há suporte para consistência sequencial.
WTF isso tem a ver com memória? Isso implica que as gravações em variáveis por diferentes processadores devem ser vistas na mesma ordem por todos os processadores. Em hardware com um modelo forte, isso é garantido. No hardware com um modelo fraco, não é.
As respostas existentes interpretam a pergunta apenas em termos de modelos de memória de software. Hardware não é irrelevante para a programação. Essa mesma pergunta menciona o iOS, que normalmente é executado em processadores Arm7. Arm7 tem um modelo de memória fraco. Para programadores acostumados a processadores com um modelo forte - que somos todos nós porque x86 e x64 têm um modelo forte - esta é uma armadilha terrível. Usar um bool para sinalizar a saída de outro thread funciona bem em um modelo forte. O mesmo código no Arm não funciona a menos que você marque a bandeira como volátil, e mesmo assim é errático.
Embora seja verdade que o Arm8 + muda isso totalmente com suporte explícito para aquisição / lançamento, o software legado não usa esse suporte. O software legado inclui todos os três sistemas operacionais de telefone e tudo o que é executado neles, bem como compiladores e bibliotecas até que sejam atualizados.
Para um exame mais extenso deste tópico, remeto-o ao inimitável Herb Sutter .
fonte