我有一个 BaseViewController ,其中包含block类型的属性:
typedef void (^result)(BOOL didSend);
@class ShakeView;
@interface BaseViewController : UIViewController
@property result mPlayerControlResultHandler;
@end
我希望其他子类可以访问此块。所以在 BaseViewController 的viewDidLoad
中,我这样做是为了初始化块:
- (void)viewDidLoad
{
[super viewDidLoad];
_mPlayerControlResultHandler = ^(BOOL didSend)
{
if(!didSend)
{
__block BaseViewController *blocksafeSelf = self;
[blocksafeSelf onOperatingSpeakerShortConnectionFailure];
}
};
}
这会发出警告
在此区块中强烈捕获自我可能会导致保留周期
所以我搜索了一个解决方案并尝试了所有建议here,但仍然无法解决问题。
答案 0 :(得分:2)
由于BaseViewController保留了块,并且块保留了它引用的对象,因此引用块中的self
会导致保留周期。
该块不会修改self的值,因此不需要使用__block
限定。相反,它应该被声明为弱并移动到块之外:
__weak BaseViewController *blocksafeSelf = self;
_mPlayerControlResultHandler = ^(BOOL didSend)
{
if(!didSend)
{
[blocksafeSelf onOperatingSpeakerShortConnectionFailure];
}
};