繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM