我有以下代码:
-(void)removeFilesWithPathIndices:(NSIndexSet*)indexSet {
NSInteger index = [indexSet firstIndex];
while(index >= 0) {
[self removeFileWithPathIndex:index];
index = [indexSet indexGreaterThanIndex:index];
}
}
哪个应该迭代NSIndexSet。但是,while循环不会停止,即使index = -1依据
NSLog(@"%d", index);
任何能够为我解决这个谜团的人? :)
答案 0 :(得分:10)
不要假设NSInteger
是int
。事实上并非如此。所以,<{p>}中的%d
NSLog(@"%d", index);
如果你在64位模式下编译,会欺骗你。请参阅NSInteger文档。
您甚至不应该假设indexGreaterThanIndex
返回-1
。
文档明确说明它返回NSNotFound
。通过遵循文档,您最终会发现NSNotFound
为NSIntegerMax
,NSInteger
中的最大可能值。当NSInteger
为long
并投放到int
时,他会成为-1
。但这是一个实现细节,你不应该依赖它。这就是他们开始定义符号常量NSNotFound
的原因。
您应该按照文档说的那样,编写像
这样的代码while(index != NSNotFound) {
[self removeFileWithPathIndex:index];
index = [indexSet indexGreaterThanIndex:index];
}
从某种意义上说,你甚至不应该宣布
NSInteger index;
因为Foundation中的索引都是NS
U Integer
。
答案 1 :(得分:5)
indexGreatherThanIndex:
返回NSNotFound
。 Apple Documentation
NSNotFound
定义为NSIntegerMax
,即>= 0
。 Apple Documentation
您的NSLog
声明只是给您一个欺骗性的结果。而不是:
while(index >= 0)
使用:
while(index != NSNotFound)