2015-10-20 1 views
0

Mon objet ont une variable d'instance, comme ceci:iOS: variable d'instance dans le bloc

@interface MyObject : NSObject 
{ 
@private 
    NSDictionary * resultDictionary ; 
} 

c'est la méthode:

- (void) doSomething 
{ 
    __weak typeof(self) weakSelf = self ; 

    [TaskAction invoke:^(NSDictionary* result){ 
     if(result){ 
      weakSelf->resultDictionary = result ; // dereferencing a weak pointer is not allowed due to possible null value caused by race condition , assign it to strong variable first ... 
     } 
    }] 
} 

le compilateur iOS lancer une erreur: // déréférencement un faible pointeur n'est pas autorisé en raison de la valeur nulle possible causée par la condition de concurrence, l'affecter à la variable forte d'abord ...

la déclaration d'erreur est: weakSelf-> resultDictionary = résultat;

Pourriez-vous m'aider pourquoi l'erreur.

Répondre

2

Vous n'avez en fait pas besoin de la référence faible dans ce code. Il n'y a aucun risque d'un cycle de conservation ici. Cependant, si vous le faisiez, la solution serait de faire une propriété pour l'ivar privé. Ensuite, vous pouvez accéder à la propriété via le pointeur faible à l'intérieur du bloc.

Note latérale - ne pas mettre d'ivars privés dans l'interface publique. Il n'y a pas de bonne raison de mettre des détails privés dans l'interface publique. Placez l'ivar privé (ou la propriété privée) dans l'extension de classe privée dans le fichier .m.

.h:

@interface MyObject : NSObject 
@end 

fichier .m:

@interface MyObject() 

@property (nonatomic, strong) NSDictionary *resultDictionary; 
@end 

@implementation MyObject 

- (void)doSomething { 
    [TaskAction invoke:^(NSDictionary* result){ 
     if (result){ 
      self.resultDictionary = result; 
     } 
    }]; 
} 

@end 
+0

À mon avis, vous avez tort. 1, Si créer une propriété, le statut de l'ivar ne sera pas privé. 2, en bloc, nous ne pouvons pas utiliser self, le pointeur 'self' est un pointeur fort – user5465320

+1

Non, la propriété est privée. Il est défini dans l'extension de classe privée. Et il n'y a rien de mal à une forte référence à soi dans ce cas. Il n'y a pas de cycle de référence. Essayez-le. – rmaddy

+0

Ils n'ont pas besoin d'utiliser une propriété - ils peuvent utiliser un ivar s'ils le veulent; Bien que je suis d'accord que l'ivar devrait être déclaré dans l'extension ou la mise en œuvre et non dans l'interface. – newacct