2016-07-25 49 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]; 
    } 
}; 
相關問題