1

我遇到了一些关于目标 c 块的非常烦人的问题。假设我们有这样的代码:

//Class1.h
#import <Foundation/Foundation.h>

typedef void (^Class1Callback)(BOOL bl);

@interface Class1 : NSObject { }

- (id)initWithCallback:(Class1Callback)callback;

@end

//Class2.h
#import <Foundation/Foundation.h>

typedef enum Class2Enum { Foo, Bar, FooBar } Class2Enum;

typedef void (^Class2Callback)(Class2Enum ce);

@interface Class2 : NSObject { }

- (id)initWithCallback:(Class2Callback)callback;

@end

//main.c
#import "Class1.h"
#import "Class2.h"

int main(int argc, char *argv[]) {
    Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];
    Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];
}

在此代码中,我收到错误“初始化'void (^)(enum Class2Enum)'的不兼容块指针类型,预期'Class1Callback'”行

Class2 *class2 = [[Class2 alloc] initWithCallback:^(Class2Enum ce){ }];

但是当我只是在 main.c 中反向导入时,即

#import "Class2.h"
#import "Class1.h"

错误改变了它的位置和描述 - 现在它是一致的

Class1 *class1 = [[Class1 alloc] initWithCallback:^(BOOL bl){ }];

并且描述是“初始化'void(^)(BOOL)'的不兼容块指针类型,预期'Class2Callback'”

当方法的声明说块类型是 Class1Callback 时,为什么编译器会期望“Class2Callback”?我不知道它为什么会发生,我应该在哪里寻找以及我应该阅读什么来找到答案。有什么建议么?

4

1 回答 1

7

+alloc返回 an id,它是 Objective-C 中的通用对象类型。因此,编译器不知道-initWithCallback:您的意思,因为id理论上这可能是您的任何一个类的实例。在这样的冲突情况下,您必须将+alloc调用结果转换为您正在实例化的类:

Class1 *class1 = [(Class1 *)[Class1 alloc] initWithCallback: ...];

或者,重命名您的初始化方法,使它们不相同,编译器将能够区分它们。如果可以,请尝试更具描述性的内容:

- (id)initWithCompletionHandler: (Class1Callback)handler;
- (id)initWithProgressHandler: (Class2Callback)handler;
于 2011-01-17T16:25:42.517 回答