2016-03-24 3 views
-2

Ich habe eine Situation wie folgt aus:Objective-C: Sind Blöcke innerhalb von Methoden stark oder schwach definiert?

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

    void (^myBlock1)(void) = ^{ 
     // ... do stuff 
    }; 

    void (^myBlock2)(void) = ^{ 
     [weakSelf doSomeHeavyNetworkCall2:^{ 
      myBlock1(); 
     }]; 
    }; 

    [self doSomeHeavyNetworkCall1:^{ 
     myBlock2(); 
    }]; 
} 

Was ist der Lebenszyklus von myBlock1 und myBlock2 in diesem Fall? Soll ich so nach Nil suchen?

void (^myBlock2)(void) = ^{ 
    [weakSelf doSomeHeavyNetworkCall2:^{ 
     if (myBlock1) { 
      myBlock1(); 
     } 
    }]; 
}; 

[self doSomeHeavyNetworkCall1:^{ 
    if (myBlock2) { 
     myBlock2(); 
    } 
}]; 

Auch wenn ich die gesamte someMethod in @synchronized wickeln, bin ich garantiert rund um die Blöcke haben?

+0

Zum Umpacken von 'someMethod' in' @ synchronized', beachten Sie, dass diese Blöcke nicht synchronisiert werden, wenn diese Blöcke asynchron ausgeführt werden. Die Direktive '@ synchronized' betrifft nur das, was synchron läuft. Wenn Sie die Callbacks synchronisieren möchten, müssen Sie '@ synchronized' Direktiven _inside_ die Blöcke einfügen und nicht' someMethod'. – Rob

Antwort

2

Lokale Variablen sind in Objective-C standardmäßig stark, daher sind myBlock1 und myBlock2 stark. Es besteht keine Notwendigkeit für die Prüfungen if (myBlock1) und if (myBlock2).

Das Umhüllen des Inhalts von someMethod mit @synchronized hat keinen Einfluss auf den Lebenszyklus dieser Variablen.

+0

Vielen Dank. Wenn sie beibehalten werden, bedeutet dies, dass diese Instanz ebenfalls beibehalten wird. Bedeutet das, dass ich nicht "__weak typeof (self) weakself = self;" und "[weakSelf doSomeHeavyNetworkCall2:^{? – Gomfucius

+0

Die Verwendung von 'weakSelf' ist ein völlig eigenständiges Problem im Zusammenhang mit möglichen Referenzzyklen. Das hat aber nichts mit den Variablen 'myBlock1' und' myBlock2' zu tun. – rmaddy

Verwandte Themen