为什么我从Xcode收到此警告? iOS代码似乎很好

时间:2011-12-20 04:42:46

标签: iphone objective-c ios xcode

这个让我难过。我正在写一个跟踪公交时刻表的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。

4 个答案:

答案 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类,我只是没有解决它。在编写代码时,要相信自己的鼻子。如果它闻起来很有趣,很可能是。