Esclarecimento sobre o bloco de documentos da Apple?
Eu estou trabalhando com alguns problemas de retenção de ciclo com blocos / ARC, e estou tentando entender minhas nuances. Qualquer orientação é apreciada.
A documentação da Apple sobre "Blocos e Variáveis" (http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html) diz o seguinte:
Se você usar um bloco dentro da implementação de um método, as regras para gerenciamento de memória de variáveis de instância de objeto são mais sutis:
Se você acessar uma variável de instância por referência, o self será retido; Se você acessar uma variável de instância por valor, a variável será retida. Os exemplos a seguir ilustram as duas situações diferentes:
dispatch_async(queue, ^{
// instanceVariable is used by reference, self is retained
doSomethingWithObject(instanceVariable);
});
id localVariable = instanceVariable;
dispatch_async(queue, ^{
// localVariable is used by value, localVariable is retained (not self)
doSomethingWithObject(localVariable);
});
Acho essa explicação confusa.
Este uso apropriado da terminologia "por valor" / "por referência"? Assumindo que essas variáveis são do mesmo tipo (id), parece que a característica distintiva entre elas é o seu escopo.Eu não vejo como o self está sendo referenciado no exemplo "por referência"? Se um método de acesso estivesse sendo usado (por exemplo, abaixo), eu poderia ver o self sendo retido.
doSomethingWithObject (self.instanceVariable);
Você tem alguma orientação sobre quando alguém pode querer fazer as coisas de um jeito ou de outro?
Se a sabedoria convencional é utilizar as variáveis "por valor", parece que isso resultará em muito código adicional para declarações de variáveis adicionais?Em uma circunstância em que blocos aninhados estão entrando em jogo, parece que pode ser mais sustentável evitar a declaração dos blocos dentro um do outro, já que se pode acabar com um pot-pourri de objetos não intencionalmente retidos?