2016-07-25 37 views
0

我有一个BaseViewController包含类型块的属性:声明一个模块在一个超类可以访问由子类

typedef void (^result)(BOOL didSend); 

@class ShakeView; 

@interface BaseViewController : UIViewController 

@property result mPlayerControlResultHandler; 

@end 

我想,这个块可以通过其他子类进行访问。因此,在BaseViewControllerviewDidLoad我这样做是为了初始化块:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

      [blocksafeSelf onOperatingSpeakerShortConnectionFailure]; 
     } 
    }; 
} 

这将抛出一个警告

在此块强烈捕获的自我很可能会导致一个保留周期

所以我搜索了一个解决方案,并尝试一切建议here但仍然无法解决问题。

回答

2

由于BaseViewController保留了块,并且块保留了它所引用的对象,所以在块中引用self会导致保留周期。

该块不会修改self的值,因此无需使用__block进行限定。相反,它应该被宣布为弱并且移动到区块之外:

__weak BaseViewController *blocksafeSelf = self; 

_mPlayerControlResultHandler = ^(BOOL didSend) 
{ 
    if(!didSend) 
    { 
     [blocksafeSelf onOperatingSpeakerShortConnectionFailure]; 
    } 
}; 
相关问题