2016-07-25 3 views
0

habe ich eine BaseViewController, die eine Eigenschaft des Typs Block enthält zugegriffen werden kann:ein Block in einem Super-Klasse Deklarieren, die durch Subklassen

typedef void (^result)(BOOL didSend); 

@class ShakeView; 

@interface BaseViewController : UIViewController 

@property result mPlayerControlResultHandler; 

@end 

Ich möchte, dass dieser Block von anderen Unterklassen zugänglich sein kann. So in viewDidLoad von BaseViewController ich dies tat, den Block zu initialisieren:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _mPlayerControlResultHandler = ^(BOOL didSend) 
    { 
     if(!didSend) 
     { 
      __block BaseViewController *blocksafeSelf = self; 

      [blocksafeSelf onOperatingSpeakerShortConnectionFailure]; 
     } 
    }; 
} 

Diese Warnung

Capturing selbst stark in diesem Block werfen würde, ist wahrscheinlich Zyklus ein behalten führen

Also suchte ich nach einer Lösung dieses und versuchte alles vorgeschlagen here aber nach wie vor nicht in der Lage, das Problem zu lösen.

Antwort

2

Da der BaseViewController den Block beibehält und der Block die Objekte beibehält, die er referenziert, verursacht der Verweis auf self im Block einen Retain-Zyklus.

Der Block ändert nicht den Wert selbst, so muß er nicht mit __block qualifiziert werden.

__weak BaseViewController *blocksafeSelf = self; 

_mPlayerControlResultHandler = ^(BOOL didSend) 
{ 
    if(!didSend) 
    { 
     [blocksafeSelf onOperatingSpeakerShortConnectionFailure]; 
    } 
}; 
: Stattdessen sollte es außerhalb des Blocks erklärt schwach und bewegt werden
Verwandte Themen