【发布时间】:2014-05-17 15:13:17
【问题描述】:
在我的单元测试中,我查看了一些边界条件,但我的测试一直失败。当它的索引一直延伸到 NSNotFound-1(每个文档的最大合法值)时,我跟踪它以通过索引集进行枚举。
使用此测试代码:
// Create an index set with NSNotFound-5, NSNotFound-4, NSNotFound-3,
// NSNotFound-2 and NSNotFound-1
NSIndexSet *testSet = [NSIndexSet indexSetWithIndexesInRange:
NSMakeRange( NSNotFound - 5, 5 )];
NSLog( @"Index set with %lu entries: %@", (unsigned long) testSet.count, testSet );
NSLog( @"NSNotFound is %lu and NSNotFound-1 is %lu", NSNotFound, NSNotFound - 1 );
__block int count = 0;
[testSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
NSLog( @"- %lu", (unsigned long) idx );
++count;
}];
NSLog( @"The count is %d", count );
在我得到的日志输出中:
Index set with 5 entries: <NSIndexSet: 0x10057f890>[number of indexes: 5 (in 1 ranges), indexes: (9223372036854775802-9223372036854775806)]
NSNotFound is 9223372036854775807 and NSNotFound-1 is 9223372036854775806
- 9223372036854775802
- 9223372036854775803
- 9223372036854775804
- 9223372036854775805
The count is 4
我在我的 Mac 和 iOS 模拟器上进行了尝试,得到了相同的结果(除了 NSNotFound 的实际值,取决于 32 位或 64 位)。
这让我觉得也许我读错了文档。是我做错了什么还是 Apple 的错误?
【问题讨论】:
-
这是一个有趣的问题。 +1
-
这看起来真的像
enumerateIndexesWithOptions中的一个错误。 -
如果范围从
NSNotFound - 6开始(并保持长度为5),是否有效? -
是的,按预期结果是 5。
-
我认为这实际上是 NSIndexSet 中一个更广泛的错误;它的所有枚举方法都有相同的问题。当然值得提交错误报告。也就是说,我很好奇这是怎么出现的,以及它是否可能影响实际代码——我敢肯定,分配 9223372036854775807 个对象的数组不会有太多运气。 :-)
标签: ios macos cocoa nsindexset