[英]I am getting an “Implicit conversion from enumeration type” warning in Xcode for iOS and I don't know why
[英]Why am I getting this warning from Xcode? The iOS code seems fine
这个让我难过。 我正在写一个跟踪公交时刻表的iPhone应用程序。 用户可以为他们喜爱的公交车站添加书签,以便他们可以从主屏幕直接跳转到他们。 我在AppDelegate类中管理收藏夹列表(不相关的代码已被编辑):
@interface AppDelegate : NSObject <UIApplicationDelegate>
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop;
@end
我有一个视图控制器,它显示给定公交路线的停靠点列表,并允许用户选择一个在新视图中查看该站点的预测公交车到达时间(并可能将停靠点添加到他们的收藏夹列表中):
@implementation RouteStopsViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
FavoriteStopData *stopData = [[FavoriteStopData alloc] init];
// ... set various properties in stopData from data in the selected cell
FavoriteStopViewController *fvc = [[FavoriteStopViewController alloc] initWithNibName:@"FavoriteStopViewController" bundle:nil];
fvc.stop = stopData;
fvc.isBookmarked = [AppDelegate isInFavorites:stopData];
[stopData release];
[self.navigationController pushViewController:fvc animated:YES];
[fvc release];
}
@end
这条线
fvc.isBookmarked = [AppDelegate isInFavorites:stopData];
得到两个警告:
“'AppDelegate'可能无法回复+ isInFavorites:”
“传递'setIsBookmarked'的参数1从指针中生成整数,而不使用强制转换”
我看不出Xcode有什么理由认为'+ isInFavorites:'是未定义的,但确实如此。 我已经确认这些警告的可能原因实际上并非如此:
'+ isFavorites:'在“AppDelegate.h”中声明(如上所示)
“RouteStopsViewController.m”执行#import“AppDelegate.h”(以及“FavoriteStopData.h”和“FavoriteStopViewController.h”)
'isBookmarked'是FavoriteStopViewController上的公共BOOL属性
一些#define宏没有使用代码; 当我预处理“RouteStopsViewController.m”时,此代码保持不变。
代码表现正常,但我真的不想忍受每次代码编译时都必须忽略的警告,并且使用#pragma禁用此警告是一条我不愿意接受的道路,除非我必须这样做。
我已经尝试重命名方法名称,变量名称,使用方法设置本地BOOL变量,然后使用条件运算符(x?y:z)设置属性,以确保我传递BOOL到财产......没有任何作用。 第一次警告永远不会消失。
任何人都可以建议为什么Xcode会给我这个警告?
这是在运行Mac OS X 10.6.8(Snow Leopard)的MacBook Pro上的5.0 iPhone模拟器中运行的Xcode 4.2(Build 4C199)和iOS 5 SDK。
如果编译器完全不知道+isInFavorites:
方法,那么你会看到类似+isInFavorites: not found (return type defaults to 'id')
的警告+isInFavorites: not found (return type defaults to 'id')
。
如果您没有看到该警告,那么我们可以假设编译器已经在某处看到了该方法的声明。 但是,编译器期望此方法返回指针而不是BOOL,这就是为什么你在makes integer from pointer without a cast
警告的makes integer from pointer without a cast
看到makes integer from pointer without a cast
原因。
检查项目中isInFavorites:
方法的任何其他声明。 检查可能与您的类名冲突的任何名为AppDelegate
全局变量。 检查AppDelegate.h和RouteStopsViewController.h之间的任何循环导入。 尝试重命名您的AppDelegate类。
在你的appdelegate.h文件中声明你的isInFavorites方法。
'AppDelegate'可能无法回复+ isInFavorites:
传递'setIsBookmarked'的参数1会使指针中的整数不带强制转换
第一个错误导致第二个错误。 编译器对+isInFavorites:
存在的+isInFavorites:
导致编译器假定返回类型为id
这个假设导致警告在没有强制转换的情况下从指针生成整数
你真的必须专注于第一个警告。
这些是唯一的警告吗?
尝试将AppDelegate.h更改为
@class FavoriteStopData
@interface AppDelegate : NSObject <UIApplicationDelegate>
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop;
@end
如果您仍然遇到问题,您可能需要考虑将此设置为实例方法,考虑到appDelegate对应用程序的整个运行时有效
找到了。 即使是完美的感觉......现在我确切地知道要去哪里看。
我的项目有两个目标:Dev用于测试新代码的版本,以及用于面向用户版本的App。 每个都有自己的AppDelegate类(以及其他一些重复项)。 特定于一个目标或另一个目标的代码进入./Dev/或./App/文件夹。 常用代码进入其他文件夹。
最近我推出了一个特定于Dev的类,用于两个目标......但还没有将文件移出Dev文件夹。 这是我有问题的RouteStopsViewController。 我的项目正在编译正确的“AppDelegate.m”,但Xcode发现'错误'(我的想法)“AppDelegate.h”,因为它首先在与“RouteStopsViewController.m”相同的文件夹中查找。
修复很简单:将RouteStopsViewController从特定于Dev的文件夹中移动到一个用于两个目标共享的代码。 现在,Xcode使用它正在编译的“AppDelegate.m”文件来查找匹配的“AppDelegate.h”。
我知道当我决定在App目标中重用它时,我应该移动那个RouteStopsViewController类,我只是没有解决它。 在编写代码时,要相信自己的鼻子。 如果它闻起来很有趣,很可能就是这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.