Doh. Cher futur googlers: bien sûr, operation
est nul lorsqu'il est copié par le bloc, mais il ne veut pas avoir à être copié. Il peut être qualifié avec __block
comme:
//THIS MIGHT LEAK! See the update below.
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
while( ! [operation isCancelled]){
//do something...
}
}];
Mise à JOUR:
Après la méditation, il me semble que cela va créer un cycle de conserver en vertu de l'ARC. Dans l'ARC, je crois, __block
de stockage est conservé. Si oui, nous sommes en difficulté, parce qu' NSBlockOperation
permet également de solides références au passé dans le bloc, qui a maintenant une référence forte à l'opération, qui a une forte référence au passé dans le bloc, qui...
C'est un peu moins élégant, mais l'utilisation explicite d'une référence faible, devrait rompre le cycle:
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakOperation = operation;
[operation addExecutionBlock:^{
while( ! [weakOperation isCancelled]){
//do something...
}
}];
Quelqu'un qui a des idées pour une solution plus élégante, s'il vous plaît commentaire!