当前位置:  开发笔记 > IOS > 正文

为什么我需要将自己投射到身份证?

如何解决《为什么我需要将自己投射到身份证?》经验,为你挑选了1个好方法。

我有一个带有(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:以避免冲突,并可能使其更具描述性.你没有说出这个类目前的名称,也没有说"源"是什么,所以我不能抛弃任何可能性.



1> Dave Dribin..:

通常,这意味着在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:以避免冲突,并可能使其更具描述性.你没有说出这个类目前的名称,也没有说"源"是什么,所以我不能抛弃任何可能性.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有