Cocoa:while(index> = 0)继续,即使index == -1

时间:2010-07-15 18:38:03

标签: objective-c cocoa macos while-loop

我有以下代码:

-(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);

任何能够为我解决这个谜团的人? :)

2 个答案:

答案 0 :(得分:10)

不要假设NSIntegerint。事实上并非如此。所以,<{p>}中的%d

NSLog(@"%d", index);
如果你在64位模式下编译,

会欺骗你。请参阅NSInteger文档。

您甚至不应该假设indexGreaterThanIndex返回-1。 文档明确说明它返回NSNotFound。通过遵循文档,您最终会发现NSNotFoundNSIntegerMaxNSInteger中的最大可能值。当NSIntegerlong并投放到int时,他会成为-1。但这是一个实现细节,你不应该依赖它。这就是他们开始定义符号常量NSNotFound的原因。

您应该按照文档说的那样,编写像

这样的代码
while(index != NSNotFound) {
    [self removeFileWithPathIndex:index];
    index = [indexSet indexGreaterThanIndex:index];
}

从某种意义上说,你甚至不应该宣布

NSInteger index;

因为Foundation中的索引都是NS U Integer

答案 1 :(得分:5)

当没有任何大于指定索引的值时,

indexGreatherThanIndex:返回NSNotFoundApple Documentation

NSNotFound定义为NSIntegerMax,即>= 0Apple Documentation

您的NSLog声明只是给您一个欺骗性的结果。而不是:

while(index >= 0)

使用:

while(index != NSNotFound)