Pracuję nad tym kodem, który wykonuje długą, asynchroniczną operację w sieci, a po jej zakończeniu uruchamia blok kończący, gdzie jakiś test jest wykonywany i czy zmienna dostać pewną wartość kolejna długa operacja powinna rozpocząć się natychmiast:Jak naprawić "przechwytywanie 'bloku' mocno w tym bloku, prawdopodobnie doprowadzi do zatrzymania cyklu"
-(void) performOperation
{
void(^completionBlock) (id obj, NSError *err, NSURLRequest *request)= ^(id obj,NSError *err, NSURLRequest *request){
int variable=0;
// Do completion operation A
//...
//...
// Do completion operation B
//Get the variable value
if(variable>0){
[self doLengthyAsynchronousOperationWithCompletionBlock: completionBlock];
}
};
//Perform the lenhgty operation with the above completionBlock
[self doLengthyAsynchronousOperationWithCompletionBlock: completionBlock];
}
-(void) doLengthyAsynchronousOperationWithCompletionBlock: completionBlock
{
//Do some lengthy asynchronous stuff
}
z tego kodu uzyskać to ostrzeżenie kompilatora:
WARNING: Block pointer variable 'completionBlock' is uninitialized when caputerd by the block
zmieniłem:
void(^completionBlock) (id obj, NSError *err, NSURLRequest *request)= ^(id obj,NSError *err, NSURLRequest *request)
w:
__block void(^completionBlock) (id obj, NSError *err, NSURLRequest *request)= ^(id obj,NSError *err, NSURLRequest *request)
ale otrzymuję ten drugi ostrzeżenie:
WARNING 2: Capturing 'completionBlock' strongly in this block is likely to lead to a retain cycle
Jak mogę rozwiązać ten problem?
Dzięki
Nicola
Spójrz na to [odpowiedź] (http://stackoverflow.com/questions/7761074/arc-blocks-and-retain-cycles) –