如果我有以下对象:
当我尝试这样调用它时:
编译器报错如下:
@interface Simple : NSObject
@end
@interface Complex : Simple
@end
还有另一个类似的对象:
@interface Test : NSObject
+(void) doSomething:(void (^)(Simple*)) obj;
@end
如果我这样调用方法,一切都可以正常运行:
[Test doSomething:^(Simple * obj) {
}];
当我尝试这样调用它时:
[Test doSomething:^(Complex * obj) {
}];
编译器报错如下:
不兼容的块指针类型,将'void (^)(Complex *__strong)'发送到类型为'void (^)(Simple *__strong)'的参数
由于Complex
扩展了Simple
,我认为这应该像Java一样工作。
有什么方法可以解决这个问题吗?
Test
请求并获得一个带有签名的块的引用,该签名表示该块需要一个类型为Simple
的参数。传递一个接受子类型Complex
的块可能意味着Test
通过调用具有不同Simple
子类的块来进行非法调用。 - Seamus CampbellTest
中任何调用执行该块的参数是否合法。 - Seamus Campbell