2011-12-22 21 views
7

I mają następujące oznaczenia w pętliTestowanie pustą w celu C

NSArray * images = [definitionDict objectForKey:@"Images"]; 
    NSLog(@"images in definitionDict %@", images); 
    if (!images) 
     NSLog(@"NULL"); 
    else 
     NSLog(@"NOTNULL"); 

która daje następujące wyjścia

images in definitionDict (
    "/some/brol/brol.jpg" 
) 
NOTNULL 
images in definitionDict <null> 
NOTNULL 

nie zrozumieć drugim przypadku, gdy macierz obrazów jest zero. Dlaczego nie jest poprawnie wykryty w moim teście? Jak mogę debugować taki problem?

Odpowiedz

19

<null> nie jest nil. nil wydrukuje (null) po wydrukowaniu. To, co masz, to NSNull. NSNull JEST obiektem, po prostu nie reaguje za dużo. Jest dostępny jako symbol zastępczy do użycia.

Aby przetestować NSNull można użyć if ([images isEqual:[NSNull null]])

Zobacz docs uzyskać więcej informacji na NSNull

+0

Dzięki, że to rozwiązałem dla mnie. – madewulf

1

Jeśli chcesz wydrukować adres pamięci obiektu Objective-C lub jakikolwiek inny wskaźnik, ty powinien używać flagi %p, a nie %@. Flaga %@, oczekuje ciągu.

Jeśli jednak argument nie jest łańcuchem, NSLog automatycznie wywoła -description na przekazanym obiekcie. A gdy metoda zwraca obiekt NSNull The -description na tym obiekcie zwraca łańcuch <null>

NSObject *o = nil; 
NSLog(@"%p", o); 

wyjściowa:0x00000000

NSObject *o = [[NSObject alloc] init]; 
NSLog(@"%p", o); 
[o release]; 

wyjściowa: coś podobnego 0x12345678

pamiętać:

NSNull *n = [NSNull null]; 
NSLog(@"%p", n); 

wyjściowa: adres pamięci, które zawsze będą takie same, ale różnią się od 0x00000000

poprawny sposób sprawdzić, czy ich są obiekty w tablicy jest tak.

NSArray *myArray = [someObject array]; 
if([myArray isEqual:[NSNull null]]) { 
    NSLog(@"No objects"); 
} else { 
    NSLog(@"%d objects.", (int)[myArray length]; 
} 
+1

Twoje rozwiązanie na dole zawiesi się w tej sytuacji. To nie jest tablica, która nie zawiera żadnych obiektów. Jest to NSNull, a NSNull nie odpowiada na długość. –

+0

@JoshuaWeinberg Edytowałem. Nadal wydaje się tajemnicą, dlaczego Apple stworzył klasę "NSNull". A zwłaszcza dlaczego ustawić obiekt NSNull w 'NSDictionary'. Jeśli po prostu nie zdefiniowałbyś klucza, to metoda zwróciłaby 'nil'. – v1Axvw

+0

W tym przypadku musisz być w stanie odróżnić brak obiektu, wersety mające obiekt zerowy. 'zero' jest równe zero, ono również powraca, jeśli klucz nie istnieje. Tak więc, wyobrażam sobie, że po przeanalizowaniu jakiegoś JSON-a w słowniku, który zawierał "NULL" JSON, utworzono 'NSNull'. –