我有一个警告,我无法找到原因。
我在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];
}
}
答案 0 :(得分:8)
NSUInteger
可能大于unsigned int
,这可能取决于构建目标(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
(枚举值等于NSIntegerMax
(see here)将不适合unsigned int
。所以一些整数提升会发挥作用,你永远不会在这一行上达到相等(编译器告诉你的):
while (index != NSNotFound) {
将index
声明为NSUInteger
(NSIndexSet
对索引使用的类型),该问题应该可以解决。