O que exatamente significa a __block
palavra-chave em Objective-C? Eu sei que permite modificar variáveis dentro de blocos, mas eu gostaria de saber ...
- O que exatamente isso diz ao compilador?
- Faz mais alguma coisa?
- Se isso é tudo o que faz, por que é necessário em primeiro lugar?
- Está nos documentos em algum lugar? (Não consigo encontrar).
objective-c
ios
objective-c-blocks
mjisrawi
fonte
fonte
__block
nada.__block
devem ser traduzidos para Swift: ”Os fechamentos [no Swift] têm semânticas de captura semelhantes aos blocos [no Objective-C], mas diferem de uma maneira importante: as variáveis são mais mutáveis do que copiadas. Em outras palavras, o comportamento de __block no Objective-C é o comportamento padrão para variáveis no Swift. ” Do livro da Apple: Usando Swift com cacau e Objective-C (Swift 2.2).Respostas:
Diz ao compilador que qualquer variável marcada por ele deve ser tratada de maneira especial quando é usada dentro de um bloco. Normalmente, as variáveis e seu conteúdo que também são usados nos blocos são copiados, portanto, qualquer modificação feita nessas variáveis não aparece fora do bloco. Quando marcadas
__block
, as modificações feitas dentro do bloco também são visíveis fora dele.Para obter um exemplo e mais informações, consulte O tipo de armazenamento __block nos tópicos de programação de blocos da Apple .
O exemplo importante é este:
Neste exemplo, ambos
localCounter
elocalCharacter
são modificados antes que o bloco seja chamado. No entanto, dentro do bloco, apenas a modificação paralocalCharacter
seria visível, graças à__block
palavra - chave. Por outro lado, o bloco pode modificarlocalCharacter
e essa modificação é visível fora do bloco.fonte
localCounter
, mas modificalocalCharacter
. Além disso, preste atenção ao valor quelocalCounter
tem no bloco: é 42, mesmo que a variável seja aumentada antes que o bloco seja chamado, mas depois que o bloco foi criado (foi quando o valor foi "capturado").O @bbum aborda os blocos em profundidade em uma postagem do blog e aborda o tipo de armazenamento __block.
Quanto aos casos de uso que você encontrará,
__block
às vezes é usado para evitar ciclos de retenção, pois não retém o argumento. Um exemplo comum é usar self.fonte
__weak
Também seria suficiente neste caso específico? Talvez esteja mais claro ...Normalmente, quando você não usa __block, o bloco copia (retém) a variável; portanto, mesmo se você modificar a variável, o bloco terá acesso ao objeto antigo.
Nestes 2 casos, você precisa de __block:
1.Se você deseja modificar a variável dentro do bloco e esperar que seja visível fora:
2.Se você deseja modificar a variável depois de declarar o bloco e espera que o bloco veja a alteração:
fonte
__block é um qualificador de armazenamento que pode ser usado de duas maneiras:
Marca que uma variável vive em um armazenamento compartilhado entre o escopo lexical da variável original e quaisquer blocos declarados nesse escopo. E o clang irá gerar uma estrutura para representar essa variável e usar essa estrutura por referência (não por valor).
No MRC, __block pode ser usado para evitar reter variáveis de objeto que um bloco captura. Cuidado para que isso não funcione para o ARC. No ARC, você deve usar __weak .
Você pode consultar o documento da apple para obter informações detalhadas.
fonte
__block
é um tipo de armazenamento usado para tornar variáveis no escopo mutáveis, mais francamente, se você declarar uma variável com esse especificador, sua referência será passada para blocos e não uma cópia somente leitura para obter mais detalhes, consulte Programação de blocos no iOSfonte
espero que isso ajude você
vamos supor que tenhamos um código como:
dará um erro como "a variável não é atribuível" porque a variável de pilha dentro do bloco é imutável por padrão.
adicionar __block (modificador de armazenamento) antes da declaração torna-o mutável dentro do bloco, ou seja
__block int stackVariable=1;
fonte
Na especificação de idioma do bloco :
Para obter detalhes sobre o que uma variável __block deve compilar, consulte Especificações de Implementação de Bloco , seção 2.3.
fonte
Isso significa que a variável para a qual é um prefixo está disponível para ser usada dentro de um bloco.
fonte