我有一個警告,我無法找到原因。警告:由於數據類型範圍有限導致崩潰,因此比較始終爲真
我在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];
}
}
Thanks Mat。這解決了這個問題。 – Mike