15 votes

Le déréférencement d'un pointeur __faible n'est pas autorisé à l'intérieur d'un bloc.

Documents d'Apple disons que je peux éviter un cycle de référence forte en capturant une référence faible à self, comme ceci :

- (void)configureBlock {
    XYZBlockKeeper * __weak weakSelf = self;
    self.block = ^{
        [weakSelf doSomething];   // capture the weak reference
                                  // to avoid the reference cycle
    }
}

Pourtant, quand j'écris ce code, le compilateur me dit :

Le déréférencement d'un pointeur __faible n'est pas autorisé en raison de la possibilité de nullité. causée par une condition de course, l'assigner d'abord à une variable forte.

Pourtant, le code suivant ne crée-t-il pas un cycle de référence fort, et ne provoque-t-il pas une fuite de mémoire ?

- (void)configureBlock {
    XYZBlockKeeper *strongSelf = self;
    self.block = ^{
        [strongSelf doSomething];
    }
}

27voto

timothy lau Points 376

Vous devriez utiliser comme celui-ci : par exemple :

__weak XYZBlockKeeper *weakSelf = self;

self.block = ^{

    XYZBlockKeeper *strongSelf = weakSelf;

    if (strongSelf) {
        [strongSelf doSomething];
    } else {
        // Bummer.  <self> dealloc before we could run this code.
    }
}

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