【发布时间】:2011-06-22 03:45:55
【问题描述】:
我遇到了一个奇怪的情况,我有两个协议和几个类,它们由实现协议的委托初始化。标准的东西,真的。但是,XCode 4 抛出了我似乎无法理解的错误警告。这是显示定义和实现的折叠源列表。
// CLASS A
@protocol ClassADelegate <NSObject>
-(void) DoSomething;
@end
@interface ClassA : NSObject { }
+(ClassA *) classWithDelegate:(id<ClassADelegate>)d;
-(ClassA *) initWithDelegate:(id<ClassADelegate>)d;
@end
@implementation ClassA
+(ClassA *) classWithDelegate:(id<ClassADelegate>)d {
return [[[ClassA alloc]initWithDelegate:d]autorelease];
}
-(ClassA *) initWithDelegate:(id<ClassADelegate>)d{
self = [super init];
return self;
}
@end
// CLASS B
@protocol ClassBDelegate <NSObject>
-(void) DoSomethingElse;
@end
@interface ClassB : NSObject<ClassADelegate> { }
+(ClassB *) classWithDelegate:(id<ClassBDelegate>)d;
-(ClassB *) initWithDelegate:(id<ClassBDelegate>)d;
-(void) DoSomething;
@end
@implementation ClassB
+(ClassB *) classWithDelegate:(id<ClassBDelegate>)d {
return [[[ClassB alloc]initWithDelegate:d]autorelease];
}
-(ClassB *) initWithDelegate:(id<ClassBDelegate>)d{
self = [super init];
return self;
}
-(void) DoSomething {
}
@end
现在这是疯狂的部分——在这一行的 ClassB 的静态构造函数中:
return [[[ClassB alloc]initWithDelegate:d]autorelease];
...编译器正在抛出一个没有意义的警告:
"Type 'id <ClassBDelegate>' does not conform to the 'ClassADelegate' protocol"
我错过了什么吗?选择器清楚地将类型设置为id<ClassBDelegate>,所以d 应该是正确的。这只是编译器感到困惑吗?
【问题讨论】:
标签: objective-c xcode4