2011-07-09 12 views
15

W Objective-C jaka jest różnica między dostępem do zmiennej w klasie za pomocą -> (operator strzałki) i . (operator kropki)? Czy -> służy do bezpośredniego dostępu do kropki (.) nie jest bezpośredni?Jaka jest różnica między "->" (operator strzałki) i "." (operator kropki) w Objective-C?

+1

podobne pytanie [kropki („”) operatora i strzałka („->”) zastosowanie operator C w porównaniu z celem C] (http://stackoverflow.com/q/9072688/642706) –

Odpowiedz

9

strzałki -> jest skrótem dla punktu w połączeniu z dereference wskaźnik, te dwie są takie same w pewnym wskaźnikiem p:

p->m 
(*p).m 

Zapis strzałka jest dziedziczony z C i C ma bo operator struktury dostępu do struktury (.) wiąże się luźniej niż operator dereferencji wskaźnika (*) i nikt nie chce przez cały czas pisać (*p).m ani nie chce zmieniać priorytetu operatorów, aby ludzie zapisywali *(p.m) do dereferencji wskaźnika wewnątrz struktury. Tak więc strzałka została dodana, dzięki czemu można było rozsądnie robić oba objaśnienia bez brzydoty nawiasów.

0

Podczas korzystania z operatora strzałki ptr->member jest to niejawnie dereferencja tego wskaźnika. Jest to odpowiednik (*ptr).member. Podczas wysyłania komunikatów do wskaźnika obiektu wskaźnik jest domyślnie również dereferencjonowany.

18

-> to tradycyjny operator C, który uzyskuje dostęp do elementu struktury przywoływanej przez wskaźnik. Ponieważ obiekty Objective-C są (zwykle) używane jako wskaźniki, a klasa Objective-C jest strukturą, możesz użyć ->, aby uzyskać dostęp do jej członków, które (zazwyczaj) odpowiadają zmiennym instancji. Zauważ, że jeśli próbujesz uzyskać dostęp do zmiennej instancji spoza klasy, to zmienna instancji musi być oznaczona jako publiczna.

Tak więc, na przykład:

SomeClass *obj = …; 
NSLog(@"name = %@", obj->name); 
obj->name = @"Jim"; 

dostęp wystąpienie zmiennej name, ogłoszonego SomeClass (lub jeden z jego nadrzędnych), odpowiednio do obiektu obj.

Z drugiej strony, . (zazwyczaj) stosuje się jako dot syntax do pochłaniacza nastawiacz metod. Na przykład:

SomeClass *obj = …; 
NSLog(@"name = %@", obj.name); 

jest równoważne użyciu metody getter name:

SomeClass *obj = …; 
NSLog(@"name = %@", [obj name]); 

Jeśli name jest declared property, że to możliwe, aby dać jej metoda getter inną nazwę.

Składnia punktowa jest również używana w metodach ustawiających. Np

SomeClass *obj = …; 
obj.name = @"Jim"; 

odpowiada:

SomeClass *obj = …; 
[obj setName:@"Jim"]; 
+6

Rozróżnienie jest bardziej oczywiste, jeśli nazwa zmiennej instancji różni się od właściwości (np. '@synthesize name = ivar_name').Wtedy możesz uzyskać dostęp do zmiennej instancji za pomocą 'someObject-> ivar_name' i możesz uzyskać dostęp do gettera właściwości za pomocą' someObject.name'. – Chuck

+0

@Bavarious W tej chwili ta odpowiedź jest myląca, dlaczego jest tak wiele dyskusji o tym, czym jest "imię"? Czy nazwa jest typu getter/setter typu instancji. obj, wskaźnik, musi być odsyłany przed uzyskaniem dostępu do nazwy, bez względu na to, jaka jest nazwa, corrent? Czy twoja odpowiedź nie powinna być po prostu tym, że obj-> nazwa jest taka sama jak (* obj) .name? A może twoja odpowiedź mówi po części, że obiekty pobierające/ustawiające Objective C nie muszą oceniać wskaźnika obiektu i są po prostu dostępne za pomocą notacji kropkowej? Być może gdyby elipsy nie były używane dla każdej deklaracji SomeClass * obj = ...; Lepiej zrozumiem ... :) –

+0

@Chuck co oznacza "Klasa Objective-C to struktura"? Co to znaczy, że klasa jest strukturą ?! Czy nie są one zasadniczo różne? klasy są typami referencyjnymi, a struktury są typami wartości? (Przepraszam, że zadzwoniłem do ciebie, ale Bavarious nie używa już jego konta) – Honey

Powiązane problemy