不兼容的块指针类型将'void(^ __ strong)(__ strong id)'发送到类型'swizzleBlock'的参数(又名'void(^)(void)')

时间:2018-08-29 08:44:17

标签: objective-c

尝试将FBSDKEventBindingManager.m错误修复几天,但是仍然很难找到解决方案。

错误:

  

不兼容的块指针类型将'void(^ __ strong)(__ strong id)'发送到类型'swizzleBlock'(又名'void(^)(void)')的参数

此行中的错误=> withBlock:blockToSuperview named:@"map_control"];

void (^blockToSuperview)(id view) = ^(id view) {
    [self matchView:view delegate:nil];
};

void (^blockToWindow)(id view) = ^(id view) {
    [self matchView:view delegate:nil];
};


[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview) 
                       onClass:[UIControl class]
                     withBlock:blockToSuperview named:@"map_control"];

[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
                       onClass:[UIControl class]
                     withBlock:blockToWindow named:@"map_control"];

1 个答案:

答案 0 :(得分:0)

问题是FBSDK使用typedef的swizzleBlock

typedef void (^swizzleBlock)();

这可以解释为

typedef void (^swizzleBlock)(void); //void (^)(void) format

第24行here

所传递的参数类型

void (^blockToSuperview)(id view) = ^(id view) // void (^__strong)(__strong id)'

这会导致类型不匹配并向您显示错误

  

不兼容的块指针类型将'void(^ __ strong)(__ strong id)'发送到类型'swizzleBlock'(又名'void(^)(void)')的参数

请参阅this,它将帮助您在各个方面理解Objective-C块语法。

您应该更新typedef以匹配传递的块。

typedef void (^swizzleBlock)(id);

修复,这将在某个时间点修复错误,但是在同一文件中,还有许多其他类型的块具有不同的格式,例如tableViewBlock(第185行),collectionViewBlock(第200行)checkout here。因此,您将必须寻找一些通用的解决方法来解决它。

希望有帮助。

相关问题