2016-11-22 5 views
0

So habe ich den folgenden Code:Zuweisen einer Variablen innerhalb eines Blocks erfordert schwache Referenz?

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
     if (data) { 
      NSLog(@"The Data: %@", data); 
      homeConfigData = data; 
     } 
    } failure:^(NSError *error, BaseServiceHandler *context){ 
     homeConfigData = Nil; 
     NSLog(@"Error: %@", error); 
    }]; 

hier ist homeConfigData eine Instanzvariable in meinem Viewcontroller. Diese gesamte Methode wird in einem Hintergrundthread ausgeführt. Es ist möglich, dass der ViewController freigegeben wird, sobald der Completion-Block zurückkehrt/ausgelöst wird. Also mache ich mir Sorgen, wenn ich ein Problem bekomme, wenn ich die Linie mache homeConfigData = data;

Wie würde ich damit umgehen?

Antwort

0

So:

YourClass *__weak weakSelf = self; 

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
    if (data) { 
     NSLog(@"The Data: %@", data); 
     weakSelf.homeConfigData = data; 
    } 
} failure:^(NSError *error, BaseServiceHandler *context){ 
    weakSelf.homeConfigData = Nil; 
    NSLog(@"Error: %@", error); 
}]; 

Wenn alle der starken Zeiger auf Selbst werden null, wird die Instanz die schwachen Zeiger freigegeben und alle werden, das heißt weakSelf, wird nil werden. Senden der setHomeConfigData Selektor zu Null wird ein Noop sein.

+0

Wenn weakSelf zu null wird, erhalten wir Nil = Daten. Wird das einen Absturz verursachen? Auch, bin ich richtig in der Annahme, dass ich das tun sollte? Ich kann auch weakSelf.homeConfigData nicht tun, weil "homeConfigData" eine Instanzvariable ist – user1416564

+0

Ich befolge Ihre Bedenken nicht. 'weakSelf' sollte ein Zeiger auf eine Instanz sein, daher sollte die Verwendung einer Instanzvariablen kein Problem sein. 'data' ist nicht Nil, aber' weakSelf.homeConfigData = data' ist ein No-Op, weil 'weakSelf' gleich Null ist. Wenn Sie weitere Probleme haben, senden Sie weiteren Code. –

+0

Okay, lass es mich nochmal versuchen. 'homeConfigData' ist eine private Variable. Dies bedeutet, dass Sie 'self.homeConfigData' nicht ausführen können. Es wird nicht kompiliert. Wie auch immer, ich habe es geschafft, eine Lösung zu finden und 'homeConfigData' einfach zu deklarieren, indem ich' ___block' im Vordergrund benutze. – user1416564

1

Es ist möglich, dass der ViewController freigegeben wird, sobald der Completion-Block zurückgibt/ausgelöst wird.

Eigentlich wie es jetzt geschrieben wird, ist es nicht möglich, dass die Viewcontroller durch die Zeit, die Block läuft freigegeben wird, weil diese beiden Blöcke behalten self als self in beiden Blöcken verwendet wird (weil die Instanz Variable homeConfigData wird verwendet, was implizit bedeutet self->homeConfigData).

+0

Interessant. Wenn also die Methode "getHomeConfigurationData" (die ein Methodenaufruf ist) 1 Minute dauert, um zurückzuspringen, und der enthaltene ViewController, gibt es keine Chance, dass sie freigegeben wird? – user1416564

+1

@ user1416564: ja – newacct

Verwandte Themen