2011-09-03 44 views
1

我有一個警告,我無法找到原因。警告:由於數據類型範圍有限導致崩潰,因此比較始終爲真

我在Cocoa編程中實現基於文檔的圖像幻燈片顯示的文本中的指令代碼。此警告會導致執行while循環的次數超過導致程序崩潰的正確次數。從作者的網站下載的代碼沒有這個問題。

我認爲這是我版本中輸入錯誤的一個簡單問題,但仔細閱讀這兩個版本的代碼我無法遇到任何差異。然後,我係統地將版本中的每個.h,.m,.xib和其他資源文件替換爲作者的版本,清除所有目標並在每次更換之後重建。

但是,警告不會消失,直到我最終用作者的版本替換.xcodeproj文件。此時警告消失,代碼運行時不會崩潰。然後我用另一種方法進行了實驗,將作者版本中的每個.h和.m文件同時替換爲.h和.m文件,清理所有目標,構建並再次沒有警告或崩潰。我認爲它可能是.plist文件中的一些設置,但交換該文件的兩個版本似乎沒有效果。我似乎能夠將其縮小到.xcodeproj包中的project.pbxproj文件,但我看不到如何列出的任何生成設置可能導致問題。

我將不勝感激,如果任何人都可以提供任何洞察問題或可以推薦一種方法來調試它。警告和相關代碼段與while循環如下:

生成警告:

SlideShowDocument.m: In function '-[SlideShowDocument removeSlidesAtIndexes:]': 
SlideShowDocument.m:191: warning: comparison is always true due to limited range of data type 

調試器控制檯輸出:

Slide Master[665:a0f] HIToolbox: ignoring exception '*** -[NSCFArray objectAtIndex:]: index (4294967295) beyond bounds (3)' that raised inside 

代碼:

- (void)removeSlidesAtIndexes:(NSIndexSet*)indexes; 
{ 
    NSMutableArray *slideList = [NSMutableArray array]; 

    unsigned int index = [indexes firstIndex]; 

    while (index != NSNotFound) { 
     Slide *slide = [mSlides objectAtIndex:index]; 

     [slideList addObject:slide]; 

     index = [indexes indexGreaterThanIndex:index]; 
    } 

    if ([slideList count]) { 
     //remove the slides from the master list 

     [self recordSlideChange]; 

     [mSlides removeObjectsInArray:slideList]; 

     [self notifySlidesChanged]; 
    } 
} 

回答

8

NSUInteger可能大於unsigned int,這可能取決於構建目標t(32位與64位,LP64與ILP64)。從NSUInteger

#if __LP64__ || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

如果這對你的目標之一,NSNotFound的情況下,這是一個枚舉值等於NSIntegerMaxsee here)將不適合在unsigned int。因此,一些整數推廣將開始發揮作用,你永遠不會觸及平等(編譯器告訴你有關),在這條線:

while (index != NSNotFound) { 

聲明index作爲使用由NSIndexSetNSUInteger(類型索引),並且這個問題應該可移植地解決。

+0

Thanks Mat。這解決了這個問題。 – Mike

相關問題