web-dev-qa-db-fra.com

Que signifie exactement '__weak typeof (self) faiblesSelf = self;' signifier

Ceci est utilisé dans le modèle de fragilisation de Objective-C

Je suppose que cela signifie: attribuer une référence faible à soi avec le nom `` faibleSelf '' et le type de soi (par exemple MyViewController)

Si c'est correct et vous semble évident: je veux être absolument sûr de bien faire les choses. Merci.

29
brainray

Je suppose que cela signifie: attribuer une référence faible à soi avec le nom weakSelf et le typeof self (par exemple MyViewController)

Oui, c'est presque exactement ce que cela signifie. Le type de self serait MyViewController* (avec un astérisque) pas MyViewController.

L'idée derrière l'utilisation de cette syntaxe au lieu de simplement écrire

MyViewController __weak *weakSelf = self;

facilite la refactorisation du code. L'utilisation de typeof permet également de définir un extrait de code qui peut être collé n'importe où dans votre code.

27
dasblinkenlight

En utilisant @weakify et @strongify from libExtObjC aide à simplifier la "danse faible-forte" que l'on doit parfois faire autour des blocs. L'OP le cite article .

Exemple!

__weak __typeof(self) weakSelf = self;
__weak __typeof(delegate) weakDelegate = delegate;
__weak __typeof(field) weakField = field;
__weak __typeof(viewController) weakViewController = viewController;
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    __strong __typeof(weakDelegate) strongDelegate = weakDelegate;
    __strong __typeof(weakField) strongField = weakField;
    __strong __typeof(weakViewController) strongViewController = weakViewController;

contre...

@weakify(self, delegate, field, viewController);
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    @strongify(self, delegate, field, viewController);
7
CrimsonChris

Votre interprétation est correcte. Cependant, je trouve que quand il est écrit de cette façon, c'est un peu déroutant à lire. Je le préfère avec un espace supplémentaire après typeof(self):

__weak typeof(self) weakSelf = self;
5
Zev Eisenberg

Selon les paramètres de votre compilateur, vous pouvez obtenir un avertissement "Expected ';' après l'expression ". Vous pouvez résoudre ce problème en le modifiant pour utiliser __typeof comme ceci: __typeof(self) __weak weakSelf = self;

Merci à Leo Natan et à cette question: https://stackoverflow.com/a/32145709/1758224 .

4
Eli Burke