这个让我难过。我正在写一个跟踪公交时刻表的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有什么理由认为'+ isFavorites:'是未定义的,但确实如此。我已经确认这些警告的可能原因实际上并非如此:
'+ isInFavorites:'在“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。
答案 0 :(得分:2)
如果编译器完全不知道+isInFavorites:
方法,那么您会看到+isInFavorites: not found (return type defaults to 'id')
之类的警告。
如果您没有看到该警告,那么我们可以假设编译器已经看到该方法的声明某处。但是,编译器希望此方法返回指针而不是BOOL,这就是您看到makes integer from pointer without a cast
警告的原因。
检查项目中isInFavorites:
方法的任何其他声明。检查可能与您的类名冲突的任何名为AppDelegate
的全局变量。检查AppDelegate.h和RouteStopsViewController.h之间的任何循环导入。尝试重命名AppDelegate类。
答案 1 :(得分:0)
在你的appdelegate.h文件中声明你的isInFavorites方法。
答案 2 :(得分:0)
'AppDelegate'可能无法回复+ isInFavorites:
传递'setIsBookmarked'的参数1会使指针中的整数不带强制转换
第一个错误导致第二个错误。编译器对+isInFavorites:
存在的困惑导致编译器假定返回类型为id
这个假设导致警告在没有强制转换的情况下从指针生成整数
你真的必须关注第一个警告。
这些是唯一的警告吗?
尝试将AppDelegate.h更改为
@class FavoriteStopData
@interface AppDelegate : NSObject <UIApplicationDelegate>
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop;
@end
如果您仍然遇到问题,您可能需要考虑将此作为实例方法,考虑到appDelegate对您应用的整个运行时有效
答案 3 :(得分:0)
找到它。即使是完美的意义......现在我确切地知道要去哪里看。
我的项目有两个目标:Dev用于测试新代码的版本,以及用于面向用户版本的App。每个都有自己的AppDelegate类(以及其他一些重复项)。特定于一个目标或另一个目标的代码进入./Dev/或./App/文件夹。常用代码会进入其他文件夹。
最近我推出了一个特定于Dev的类,用于两个目标......但尚未将文件移出Dev文件夹。这是我有问题的RouteStopsViewController。我的项目正在编译正确的“AppDelegate.m”,但Xcode发现'错误'(我的想法)“AppDelegate.h”,因为它首先在与“RouteStopsViewController.m”相同的文件夹中查找。
修复很简单:将RouteStopsViewController从特定于Dev的文件夹中移动到一个用于两个目标共享的代码。现在,Xcode使用它正在编译的“AppDelegate.m”文件来查找匹配的“AppDelegate.h”。
我知道当我决定在App目标中重用它时我应该移动那个RouteStopsViewController类,我只是没有解决它。在编写代码时,要相信自己的鼻子。如果它闻起来很有趣,很可能是。