80 votes

quelle est la différence entre __weak et __block reference?

Je suis en train de lire Xcode de la documentation, ici est quelque chose qui m'intrigue, c':

__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
    [tmpSelf doSomething];
}];

La suite est copié à partir de la documentation:

Un bloc forme d'un solide de référence à des variables, il capture. Si vous utilisez auto à l'intérieur d'un bloc, le bloc forme d'un solide de référence à soi-même, donc si l'auto dispose également d'une solide référence pour le bloc (qui, d'habitude, il n'), un cycle de référence résultats. Pour éviter le cycle, vous devez pour créer une faible (ou __) bloc de référence à soi à l'extérieur du bloc, comme dans l'exemple ci-dessus.

Je ne comprends pas ce que signifie " une faiblesse (ou __bloquer)"?

Est

__block typeof(self) tmpSelf = self;

et

__weak typeof(self) tmpSelf = self;

exactement la même chose ici?

Cependant, j'ai trouvé un autre morceau dans le Xcode du document:

Remarque: Dans un garbage collector de l'environnement, si vous appliquez __faibles et __bloquer les modificateurs à une variable, puis le bloc ne sera pas vous assurer qu'il est maintenu en vie.

Donc, je suis totalement perplexe.

109voto

Paul de Lange Points 6152

À partir de la documentation à propos de __bloquer

__bloc de variables vivre dans le stockage qui est partagé entre la portée lexicale de la variable et de tous les blocs et le bloc des copies déclarées ou créé au sein de la variable de portée lexicale. Ainsi, le stockage de survivre à la destruction de la trame de pile si toutes les copies des blocs déclarés dans le cadre de survivre au-delà de la fin de l'image (par exemple, par des mises en file d'attente quelque part pour exécution ultérieure). Plusieurs blocs dans un domaine lexical est possible d'utiliser simultanément une variable partagée.

À partir de la documentation à propos de __faibles

__faible indique une référence qui ne garde pas l'objet référencé vivant. Une faiblesse de référence est définie à zéro lorsqu'il n'y a de solides références à l'objet.

De sorte qu'ils sont techniquement des choses différentes. __bloc est d'arrêter votre variable d'être copiés à partir de votre portée externe dans votre bloc de portée. __la faiblesse est une auto de délimitation de la faiblesse de pointeur.

Remarque je l'ai dit, techniquement, parce que pour votre cas ils font (presque) la même chose. La seule différence est que si vous utilisez l'ARC ou pas. Si votre projet utilise l'ARC et est seulement pour iOS4.3 et au-dessus, l'utilisation __faibles. Il s'assure de la référence est fixé à néant si la portée mondiale de référence se libère en quelque sorte. Si votre projet n'est pas l'utilisation de l'ARC ou de l'est pour les anciennes versions de systèmes d'exploitation, utilisez __bloquer.

Il y a une subtile différence ici, assurez-vous de comprendre.

EDIT: une Autre pièce du puzzle est __dangereuse_consignes. Ce modificateur est presque le même que __faibles, mais pour le pré 4.3 environnements d'exécution. CEPENDANT, il n'est pas nul et peut vous laisser avec la pendaison de pointeurs.

5voto

Andrei Shender Points 726

AIn manuel de référence du mode de comptage, __bloc id x; a pour effet de ne pas retenir l'x. Dans l'ARC de mode, __bloc id x; par défaut en conservant x (comme pour toutes les autres valeurs). Pour obtenir le manuel de référence du mode de comptage de comportement en vertu de l'ARC, vous pouvez utiliser __dangereuse_consignes __bloc id x;. Comme son nom l' __dangereuse_consignes implique, cependant, avoir un non-rétention variable est dangereux (car il peut dangle) et est donc déconseillée. Les deux meilleures options à utiliser __faibles (si vous n'avez pas besoin de soutenir iOS 4 ou OS X v10.6), ou de définir l' __valeur de blocage à néant pour briser le cycle de conserver.

apple docs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X