2009-05-13 15 views
11

W przykładzie firmy Apple widziałem to:Co to jest (NSNull *) kontroler == [NSNull null] ma zrobić? Dlaczego nie tylko kontroler == zero?

myController *controller = [viewControllers objectAtIndex:page]; 
if ((NSNull *)controller == [NSNull null]) { 
    controller = [[myController alloc] initWithPageNumber:page]; 
    [viewControllers replaceObjectAtIndex:page withObject:controller]; 
    [controller release]; 
} 

Jestem bardzo zainteresowany w tej linii:

if ((NSNull *)controller == [NSNull null]) { 

Jeśli bym zrobił, to bym po prostu sprawdzić zero. Dlaczego robią to tak cholernie skomplikowane? A co to właściwie robi? Wygląda na to, że przesyłają obiekt kontrolera do NSNull, a następnie sprawdzają, czy jest on taki sam jak null z NSNull.

A.F.A.I.K. zero oznacza "brak obiektu", a zero oznacza "nic". Proszę, pomóż mi, aby uzyskać wyraźny obraz tutaj!

Odpowiedz

12

Większość kontenerów nie pozwala na umieszczenie w nich obiektu "zerowego". Jeśli naprawdę chcesz wstawić wartość pustą do swojego kontenera, możesz użyć instancji NSNull (NSNull jest singletonem).

W tym konkretnym przykładzie kontroler jest pobierany z tablicy. Dobrą praktyką jest upewnienie się, że obiekt nie był instancją NSNull.

+0

Dzięki. Czy kontroler (NSNull *) przesyła kontroler do NSNull? Pomyślałem, że istnieje operator isKindOfClass lub coś w tym stylu. – Thanks

+0

Wykonanie porównania wskaźnika jest szybsze (w czasie wykonywania) niż wywołanie isKindOfClass, ale to powinno działać, tak jak robiłbym [controller isEqual: [NSNull null]]. Jeśli uznano kontroler za "id", nie trzeba nawet rzutowania, aby uniknąć ostrzeżenia kompilatora. –

1

Klasy kolekcji takie jak NSArray i NSDictionary nie mogą zawierać wartości nil. Twój ivar, viewController, jest instancją klasy kolekcji. NSNULL został stworzony specjalnie jako obiekt zastępczy dla nil i można go umieścić w klasach kolekcji.

Klasa NSNull definiuje obiekt singleton, co oznacza, że ​​istnieje zawsze tylko jedna instancja NSNull (które create używając [NSNull null]), ale może być używany w wielu miejscach tak, jak chcesz.

Powiązane problemy