Iphone 为什么我从Xcode收到这个警告?iOS代码看起来不错
这件事把我难住了。我正在编写一个iPhone应用程序,用于跟踪公交车时刻表。用户可以将自己喜欢的公交车站添加到书签中,这样他们就可以从主屏幕直接跳到车站。我在AppDelegate类中管理收藏夹列表(无关代码已被编辑): 线路Iphone 为什么我从Xcode收到这个警告?iOS代码看起来不错,iphone,objective-c,ios,xcode,Iphone,Objective C,Ios,Xcode,这件事把我难住了。我正在编写一个iPhone应用程序,用于跟踪公交车时刻表。用户可以将自己喜欢的公交车站添加到书签中,这样他们就可以从主屏幕直接跳到车站。我在AppDelegate类中管理收藏夹列表(无关代码已被编辑): 线路 fvc.isBookmarked = [AppDelegate isInFavorites:stopData]; 获取两个警告: “'AppDelegate'可能不响应+isInFavorites:” “传递'setIsBookmarked'的参数1将从指针生成整数,而
fvc.isBookmarked = [AppDelegate isInFavorites:stopData];
获取两个警告:
“'AppDelegate'可能不响应+isInFavorites:”“传递'setIsBookmarked'的参数1将从指针生成整数,而不进行强制转换” 我看不出Xcode有任何理由认为“+isInFavorites:”是未定义的,但它确实存在。我已经证实,这些可能导致警告的原因实际上并非如此:
- “+isInFavorites:”在“AppDelegate.h”中声明(如上所示)
- “RouteStopViewController.m”不导入“AppDelegate.h”(以及“FavoriteStopData.h”和“FavoriteStopViewController.h”)
- “isBookmarked”是FavoriteStopViewController上的公共BOOL属性
- 代码没有被某些#define宏屏蔽;当我预处理“RouteStopsViewController.m”时,此代码保持不变
这是Xcode 4.2(Build 4C199)和iOS 5 SDK在运行Mac OS X 10.6.8(Snow Leopard)的MacBook Pro上的5.0 iPhone模拟器中运行的情况。如果编译器完全不知道
+isInFavorites:
方法,则会看到类似+isInFavorites:not found(返回类型默认为'id')
的警告
如果您没有看到该警告,那么我们可以假设编译器在某个地方看到了该方法的声明。但是,编译器希望此方法返回指针而不是BOOL,这就是为什么您看到从指针生成整数而没有强制转换警告的原因
检查项目中isInFavorites:
方法的任何其他声明。检查名为AppDelegate
的所有全局变量是否与您的类名冲突。检查AppDelegate.h和RouteStopsViewController.h之间是否存在任何循环导入。请尝试重命名AppDelegate类。在AppDelegate.h文件中声明您的isInFavorites方法。“AppDelegate”可能不响应+isInFavorites:
传递“setIsBookmarked”的参数1会从指针生成整数,而无需强制转换
第一个错误导致第二个错误。编译器对+isInFavorites存在的混淆:
导致编译器假定返回类型为id
此假设会导致从指针生成整数而不进行强制转换的警告
你真的必须关注第一个警告
这些是唯一的警告吗
尝试将AppDelegate.h更改为
@class FavoriteStopData
@interface AppDelegate : NSObject <UIApplicationDelegate>
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop;
@end
@class-FavoriteStopData
@接口AppDelegate:NSObject
+(BOOL)不支持:(FavoriteStopData*)inStop;
@结束
如果您还有问题,您可能需要考虑将此作为实例方法,而考虑AppDebug是有效的。应用程序的整个运行时
找到了它。甚至有完美的意义。。。现在我知道该去哪里找了
我的项目有两个目标:用于测试新代码的版本的Dev和面向用户的版本的App。每一个都有自己的AppDelegate类(以及其他一些重复的类)。特定于一个或另一个目标的代码进入./Dev/或./App/文件夹。通用代码进入其他文件夹
最近我推广了一个特定于开发人员的类,以便在两个目标中使用。。。但尚未将文件移出Dev文件夹。这是我有问题的RouteStopsViewController。我的项目正在编译正确的“AppDelegate.m”,但Xcode发现“AppDelegate.h”是错误的(我认为是错误的),因为它首先在与“RouteStopsViewController.m”相同的文件夹中查找
修复很简单:将RouteStopsViewController从特定于开发人员的文件夹移到一个由两个目标共享的代码文件夹中。现在,Xcode使用它正在编译的“AppDelegate.m”文件来查找匹配的“AppDelegate.h”
当我决定在应用程序目标中重用RouteStopsViewController类时,我就知道我应该移动它,但我就是没有去做。当涉及到编写代码时,相信你的鼻子。如果闻起来很好笑,很可能是这样。从您使用isXXXX的方式来看,似乎您试图通过所需的BOOL语句传递0或1以外的数字(否或是)。AppDelegate不应该是UIResponder的子类,而不是NSObject吗?
fvc.isBookmarked = [AppDelegate isInFavorites:stopData];
@class FavoriteStopData
@interface AppDelegate : NSObject <UIApplicationDelegate>
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop;
@end