在子类可以访问的超类中声明一个块

时间:2016-07-25 03:41:59

标签: ios objective-c inheritance

我有一个 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,但仍然无法解决问题。

1 个答案:

答案 0 :(得分:2)

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

该块不会修改self的值,因此不需要使用__block限定。相反,它应该被声明为弱并移动到块之外:

__weak BaseViewController *blocksafeSelf = self;

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