【问题标题】:Compiler error about conflicting parameter types and incompatible conversion for the same method关于相同方法的参数类型冲突和不兼容转换的编译器错误
【发布时间】:2014-04-01 02:49:25
【问题描述】:

我在尝试使用 Chartboost 中的方法时收到警告:

“didCacheInterstitial:”实现中的参数类型冲突:“CBLocation”与“NSString *__strong”

按以下方法:

- (void)didCacheInterstitial:(NSString *)location {
NSLog(@"interstitial cached at location %@", location);   
}

指向将“NSString *”发送到“CBLocation”类型参数的整数转换的不兼容指针`

执行以下操作时:

[cb cacheInterstitial:@"Main Menu"];

这里有什么问题?

【问题讨论】:

    标签: objective-c compiler-errors


    【解决方案1】:

    声明didCacheInterstitial:的头文件是这样写的:

    - (void)didCacheInterstitial:(CBLocation)location;
    

    这与您的实现不匹配。方法的定义必须与声明相匹配。

    【讨论】:

    • 有道理,但这是否意味着实际的 chartboost 教程是错误的? help.chartboost.com/documentation/ios/namedlocations
    • 出了点问题,无论是教程还是标题。我真的不知道是哪个。
    • 我明白了。你建议我如何解决这个问题?
    • 假设此协议由他们的服务调用您的代码的方法组成,信任代码而不是教程,并通过电子邮件向他们发送说明。
    • 谢谢!我继续通过将 NSString 转换为 CBLocation 并使用 %llu 而不是 %@ 正确 NSLogging 它来做到这一点。
    【解决方案2】:

    此警告旨在鼓励开发人员使用在头文件的 CBLocation 枚举中找到的预设位置。

    但是,最新的 Chartboost SDK 向后兼容传递 NSString 参数的插页式调用。

    例如,尽管发出警告,以下调用仍可正常工作:

    [[Chartboost sharedChartboost] cacheInterstitial:@"foobar"];

    SDK 中的一些技巧会自动将 @"foobar" 转换为 long,因此您可以忽略该警告。

    关于日志记录,您可以考虑使用NSLog(@"%@", location); 来确保位置的人类可读输出,而不是难以理解的数字。如上所述,尽管有警告,这仍然有效。

    全面披露:我为 Chartboost 工作。

    【讨论】:

    • 所以您使用文字字符串的地址作为“索引”......当有人稍后动态构造字符串而不是传递文字时会发生什么?你告诉使用-Werror的人什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多