2014-05-17 27 views
6

W mojej jednostce testowej patrzyłem na pewne warunki brzegowe i moje testy wciąż zawodziły. Śledziłem go z powrotem do wyliczenia poprzez zestaw indeksu, gdy jego indeksy rozciągają się aż do NSNotFound-1 (maksymalna prawna wartość na dokumentację).Czy jest to błąd w NSIndexSet enumerateIndexesUsingBlock?

Użycie tego kodu testu:

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

W wyjściowych dziennika uzyskać:

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 

Próbowałem to na moim Macu i na symulatorze iOS i uzyskać takie same wyniki (inne niż rzeczywiste wartości NSNotFound, w zależności od wersji 32-bitowej lub 64-bitowej).

To sprawiło, że pomyślałem, że może czytałem dokumentację źle. Czy robię coś złego, czy jest to błąd Apple?

+0

To interesujące pytanie. +1 – trojanfoe

+0

To naprawdę wygląda jak błąd w 'enumerateIndexesWithOptions'. –

+0

Czy to działa, jeśli zaczniesz zakres w 'NSNotFound - 6' (i zachować długość 5)? –

Odpowiedz

0

Wygląda na to, że mam potwierdzenie, że jest/był błędem. Dodałem raport o błędzie i usłyszałem od Apple, że został on naprawiony w najnowszym podglądzie programisty OS X Yosemite i Xcode Preview. Pobrałem go i wydawało się działać zgodnie z oczekiwaniami z dokumentacji.

Podejrzewam, że musieli zmienić jeden wiersz kodu, więc zapytali, czy łatają aktualne lub poprzednie wersje Xcode, ale nie słyszałem i nie wstrzymuję oddechu.

0

To nie jest błąd. Ustawiona wartość jest poza walidowanymi wartościami. "Klasa NSIndexSet reprezentuje niezmienny zbiór unikalnych liczb całkowitych bez znaku, nazywanych indeksami ze względu na sposób ich użycia, zbiór ten jest określany jako zestaw indeksów. Indeksy muszą należeć do zakresu 0 .. NSNotFound - 1." Oto link!

+0

Przeczytałem dokumentację i moje indeksy to: NSNotFound-5, NSNotFound-4, NSNotFound-3, NSNotFound-2 i NSNotFound-1, wszystkie są> 0 i <= NSNotFound-1. NSIndexSet jest tworzony poprawnie, jak pokazano na wyjściu NSLog(), ale wyliczenie nie przechodzi do ostatniego indeksu. Jeśli wykonuję '[NSIndexSet indexSetWithIndexesInRange: NSMakeRange (NSNotFound - 5, 6)] to generuje błąd' *** - [NSIndexSet initWithIndexesInRange:]: Zakres {9223372036854775802, 6} przekracza maksymalną wartość indeksu NSNotFound - 1'. Nie przekraczam maksymalnej wartości, jestem pewien, że metody wyliczeniowe są zepsute. – LavaSlider

+0

Przepraszam, źle zrozumiałem, co masz na myśli. Testowałem ten kod, myślę, że chodzi o wartość graniczną, To błąd. – user2523232