Cocoa 警告:由于数据类型范围有限导致崩溃,因此比较始终为真

Cocoa 警告:由于数据类型范围有限导致崩溃,因此比较始终为真,cocoa,compiler-warnings,xcode3.2,pbxproj,Cocoa,Compiler Warnings,Xcode3.2,Pbxproj,我得到一个警告,我无法找到死亡的原因 我在一篇关于Cocoa编程的文本中遵循教学代码,该编程实现了一个基于文档的图像幻灯片放映。此警告会导致执行while循环的次数超过导致程序崩溃的正确次数。从作者网站下载的代码没有这个问题 我认为这只是我版本中的一个简单的打字错误,但仔细阅读两个版本的代码,我没有发现任何差异。然后,我系统地用作者的版本替换了我版本中的每一个.h、.m、.xib和其他资源文件,每次替换后都会清理所有目标并重建 但是,直到我最终用作者的版本替换.xcodeproj文件,警告才会消

我得到一个警告,我无法找到死亡的原因

我在一篇关于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
代码:


NSUInteger
可能大于
unsigned int
,这取决于生成目标(32位对64位,LP64对ILP64)。发件人:

如果其中一个目标是这样的,
NSNotFound
,它是一个等于
NSIntegerMax
()的枚举值,不适合
无符号int
。因此,一些整数提升将发挥作用,并且您永远不会在这一行中遇到相等(编译器正在告诉您):

while (index != NSNotFound) {

index
声明为
NSUInteger
(由
NSIndexSet
用于索引的类型),该问题应可移植解决。

NSUInteger
可能大于
无符号int
,这取决于构建目标(32位对64位,LP64对ILP64)。发件人:

如果其中一个目标是这样的,
NSNotFound
,它是一个等于
NSIntegerMax
()的枚举值,不适合
无符号int
。因此,一些整数提升将发挥作用,并且您永远不会在这一行中遇到相等(编译器正在告诉您):

while (index != NSNotFound) {
index
声明为
NSUInteger
NSIndexSet
用于索引的类型),该问题应可移植解决

while (index != NSNotFound) {