2011-12-20 53 views
0

這一個讓我難住。我正在編寫一個跟蹤公交時刻表的iPhone應用程序。用戶可以將他們最喜歡的公共汽車站加入書籤,以便他們可以從主屏幕直接跳到他們。我管理的在我AppDelegate類收藏(無關的代碼已經被刪節)名單:爲什麼我從Xcode獲得這個警告? iOS的代碼似乎很好

@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:'是未定義的,但它確實。我已驗證了這些警告可能的原因事實上並非如此:

  • 「+ isInFavorites:」在「AppDelegate.h」聲明(如上圖所示)

  • 「RouteStopsViewController .M」並不#IMPORT 「AppDelegate.h」(和 「FavoriteStopData.h」 和 「FavoriteStopViewController.h」)

  • 'isBookmarked' 是上FavoriteStopViewController

  • 的代碼沒有被公開BOOL屬性被一些#define宏淹沒;當我預處理「RouteStopsViewController.m」時,此代碼不變。

代碼行爲正確,但我真的不想住在一起,我必須忽略每一個代碼編譯時間,以及禁止與一些的#pragma該警告的警告是路我寧願不要除非必須採取。

我試圖重新命名方法名,變量名,使用該方法來設置本地BOOL變量,然後設置與該屬性,使用條件操作符(x和y:Z),以確保我m傳遞BOOL到屬性...沒有任何工作。那第一個警告永遠不會消失。

任何人都可以提出爲什麼Xcode給我這個警告?

這是在運行Mac OS X 10.6.8(Snow Leopard)的MacBook Pro上的5.0 iPhone模擬器中運行的Xcode 4.2(Build 4C199)和iOS 5 SDK。

+0

從您使用isXXXX的方式來看,您似乎希望通過所需的BOOL語句傳遞除0或1(NO或YES)以外的數字。 – CodaFi 2011-12-20 04:54:52

+0

應該不是AppDelegate是UIResponder的子類,不是NSObject? – erdekhayser 2013-12-15 03:04:47

回答

0
的整個運行時間

找到了。即使是完美的感覺......現在我知道在哪裏看。

我的項目有兩個目標:Dev用於測試新代碼的版本,App用於面向用戶的版本。每個都有自己的AppDelegate類(和其他一些重複項)。特定於一個目標或另一個目標的代碼進入./Dev/或./App/文件夾。常用的代碼進入其他文件夾。

最近,我提出了一個開發人員特定的類在兩個目標中使用...但尚未將文件移出Dev文件夾。這是我有問題的RouteStopsViewController。我的項目正在編譯正確的「AppDelegate.m」,但Xcode發現「錯誤」(對我來說)「AppDelegate.h」,因爲它首先在與「RouteStopsViewController.m」相同的文件夾中查找。

修復很簡單:將RouteStopsViewController從Dev特定文件夾移出到兩個目標共享的代碼中。現在Xcode使用它正在編譯的「AppDelegate.m」文件來查找匹配的「AppDelegate.h」。

我當時知道我應該移動RouteStopsViewController類,當我決定在App目標中重用它時,我只是沒有理解它。談到編寫代碼時,請相信你的鼻子。如果它聞起來很有趣,那很可能是。

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類。

0

在您的appdelegate.h文件中聲明您的isInFavorites方法。

0

「的AppDelegate」可以不至+ isInFavorites響應:
傳遞參數1「setIsBookmarked」時將指針整數,未作鑄造

第一誤差引起的第二個。編譯器的上+isInFavorites:存在混亂導致編譯器假定返回類型爲id

這一假設將導致使從指針整數的警告沒有投

你真的把重點放在第一個警告。

這些是唯一的警告嗎?

試着改變你的AppDelegate.h到

@class FavoriteStopData 
@interface AppDelegate : NSObject <UIApplicationDelegate> 
+ (BOOL) isInFavorites: (FavoriteStopData*) inStop; 
@end 

如果您仍然有問題,你可能要考慮使之成爲一個實例方法,而不是考慮到的appDelegate是有效的您的應用程序

相關問題