Cocoa 警告:由于数据类型范围有限导致崩溃,因此比较始终为真
我得到一个警告,我无法找到死亡的原因 我在一篇关于Cocoa编程的文本中遵循教学代码,该编程实现了一个基于文档的图像幻灯片放映。此警告会导致执行while循环的次数超过导致程序崩溃的正确次数。从作者网站下载的代码没有这个问题 我认为这只是我版本中的一个简单的打字错误,但仔细阅读两个版本的代码,我没有发现任何差异。然后,我系统地用作者的版本替换了我版本中的每一个.h、.m、.xib和其他资源文件,每次替换后都会清理所有目标并重建 但是,直到我最终用作者的版本替换.xcodeproj文件,警告才会消失。此时警告清除,代码运行时不会崩溃。然后,我尝试了另一种方法,将作者版本中的每个.h和.m文件同时替换为我的.h和.m文件,清除所有目标,构建,并且再次没有警告或崩溃。我认为这可能是.plist文件中的一些设置,但交换该文件的两个版本似乎没有效果。我似乎能够将其缩小到.xcodeproj捆绑包中的project.pbxproj文件,但我看不出其中列出的任何构建设置是如何导致问题的 如果有人能对这个问题提供一些见解或推荐一种调试方法,我将不胜感激。带有while循环的警告和相关代码段如下所示: 生成警告:Cocoa 警告:由于数据类型范围有限导致崩溃,因此比较始终为真,cocoa,compiler-warnings,xcode3.2,pbxproj,Cocoa,Compiler Warnings,Xcode3.2,Pbxproj,我得到一个警告,我无法找到死亡的原因 我在一篇关于Cocoa编程的文本中遵循教学代码,该编程实现了一个基于文档的图像幻灯片放映。此警告会导致执行while循环的次数超过导致程序崩溃的正确次数。从作者网站下载的代码没有这个问题 我认为这只是我版本中的一个简单的打字错误,但仔细阅读两个版本的代码,我没有发现任何差异。然后,我系统地用作者的版本替换了我版本中的每一个.h、.m、.xib和其他资源文件,每次替换后都会清理所有目标并重建 但是,直到我最终用作者的版本替换.xcodeproj文件,警告才会消
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) {