我有一个带有(id)参数的init方法:
-(id) initWithObject:(id) obj;
我试着像这样称呼它:
[[MyClass alloc] initWithObject:self];
但是XCode抱怨该参数是一个"不同的Objective-C类型"(通常表示类型不匹配或间接错误的级别).
如果我明确地将自己转换为(id)警告就会消失.在任何一种情况下,代码都按预期运行.有趣的是,在下一行我将自己传递给另一个也带有id的方法,并且工作正常.
我想知道我是否遗漏了一些微妙的东西 - 或者它是编译器的特性?
直到我确定为什么必要的原因,我才完全放心.
[编辑]
我被要求提供更多代码.不确定还有其他相关的东西.这是我打电话的实际代码.请注意,它本身就是一个init方法.这是initWithSource
给出警告的呼吁:
-(id) initWithFrame:(CGRect) frame { self = [super initWithFrame: frame]; if( self ) { delegate = nil; touchDelegate = [[TBCTouchDelegate alloc] initWithSource:self]; [touchDelegate.viewWasTappedEvent addTarget: self action:@selector(viewWasTapped:)]; } return self; }
这是调用的init方法:
-(id) initWithSource:(id) sourceObject { self = [super init]; if (self != nil) { // Uninteresting initialisation snipped } return self; }
Dave Dribin.. 7
通常,这意味着在initWithSource:
具有冲突参数类型的不同类上有多个方法名称.请记住,如果输入变量,因为id
编译器不知道它是什么类.因此,如果调用initWithSource:
一个id
-typed对象并且多个类都有一个initWithSource:
方法,那么编译器基本上只选择其中一个.如果它选择"错误"的那个,那么,你得到一个"明显的Objective-C类型"错误.
那为什么会发生这种情况呢?我不是百分百肯定,但请记住,+[TBCTouchDelegate alloc]
返回一个id
.因此,链接alloc/init调用等同于:
id o = [TBCTouchDelegate alloc]; touchDelegate = [o initWithSource:self];
因此,您正在调用initWithSource:
一个id
-typed变量.如果存在冲突initWithSource:
方法,则可能会出现此编译器错误.
有没有冲突的方法?我检查了系统,唯一有冲突的是NSAppleScript
:
- (id)initWithSource:(NSString *)source;
现在NSAppleScript
是 Foundation的一部分,但我注意到这是iPhone代码.因此,在编译模拟器而不是设备时,您可能只会遇到此错误?
在任何情况下,如果这是你的问题,你可以通过将alloc/init分成两个不同的行来绕过它:
touchDelegate = [TBCTouchDelegate alloc]; touchDelegate = [touchDelegate initWithSource:self];
现在,您正在调用initWithSource:
一个完全类型的变量(而不是id
-typed),因此编译器不再需要猜测要选择哪一个.或者您可以从+alloc
以下位置投出回报:
touchDelegate = [(TBCTouchDelegate *)[TBCTouchDelegate alloc] initWithSource:self];
另一个解决方案是重命名initWithSource:
以避免冲突,并可能使其更具描述性.你没有说出这个类目前的名称,也没有说"源"是什么,所以我不能抛弃任何可能性.
通常,这意味着在initWithSource:
具有冲突参数类型的不同类上有多个方法名称.请记住,如果输入变量,因为id
编译器不知道它是什么类.因此,如果调用initWithSource:
一个id
-typed对象并且多个类都有一个initWithSource:
方法,那么编译器基本上只选择其中一个.如果它选择"错误"的那个,那么,你得到一个"明显的Objective-C类型"错误.
那为什么会发生这种情况呢?我不是百分百肯定,但请记住,+[TBCTouchDelegate alloc]
返回一个id
.因此,链接alloc/init调用等同于:
id o = [TBCTouchDelegate alloc]; touchDelegate = [o initWithSource:self];
因此,您正在调用initWithSource:
一个id
-typed变量.如果存在冲突initWithSource:
方法,则可能会出现此编译器错误.
有没有冲突的方法?我检查了系统,唯一有冲突的是NSAppleScript
:
- (id)initWithSource:(NSString *)source;
现在NSAppleScript
是 Foundation的一部分,但我注意到这是iPhone代码.因此,在编译模拟器而不是设备时,您可能只会遇到此错误?
在任何情况下,如果这是你的问题,你可以通过将alloc/init分成两个不同的行来绕过它:
touchDelegate = [TBCTouchDelegate alloc]; touchDelegate = [touchDelegate initWithSource:self];
现在,您正在调用initWithSource:
一个完全类型的变量(而不是id
-typed),因此编译器不再需要猜测要选择哪一个.或者您可以从+alloc
以下位置投出回报:
touchDelegate = [(TBCTouchDelegate *)[TBCTouchDelegate alloc] initWithSource:self];
另一个解决方案是重命名initWithSource:
以避免冲突,并可能使其更具描述性.你没有说出这个类目前的名称,也没有说"源"是什么,所以我不能抛弃任何可能性.