Odpowiedzi:
+
jest dla metody klasy i -
jest dla metody instancji.
Na przykład
// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end
// somewhere else:
id myArray = [NSArray array]; // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4]; // here the message is sent to myArray
// Btw, in production code one uses "NSArray *myArray" instead of only "id".
Jest jeszcze jedno pytanie dotyczące różnicy między metodami klasy i instancji .
@classmethod
i @method
czy tak, też. Dlaczego tak zwięzły ...?
(+) dla metod klas i (-) na przykład metoda,
(+) Metody klasowe: -
Są metody zadeklarowane jako statyczne. Metodę można wywołać bez tworzenia instancji klasy. Metody klasy mogą działać tylko na elementach klasy, a nie na elementach instancji, ponieważ metody klasy nie są świadome elementów instancji. Metod instancji klasy nie można również wywoływać z metody klasy, chyba że są one wywoływane w instancji tej klasy.
(-) Metody instancji: -
Z drugiej strony wymaga wystąpienia instancji klasy, zanim będzie można ją wywołać, dlatego należy utworzyć instancję klasy przy użyciu nowego słowa kluczowego. Metody instancji działają na określonych instancjach klas. Metody instancji nie są deklarowane jako statyczne.
Jak stworzyć?
@interface CustomClass : NSObject
+ (void)classMethod;
- (void)instanceMethod;
@end
Jak używać?
[CustomClass classMethod];
CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];
+ metody są metodami klasowymi - to znaczy metodami, które nie mają dostępu do właściwości instancji. Służy do metod takich jak metody przydzielania lub pomocnicze dla klasy, które nie wymagają dostępu do zmiennych instancji
- metody są metodami instancji - odnoszą się do pojedynczej instancji obiektu. Zwykle używany do większości metod w klasie.
Więcej informacji znajduje się w specyfikacji języka .
self
, ale raczej klasę. Po prostu nie są powiązane z instancją, a wyszukiwanie metod nie odbywa się poprzez instancję, ale przez klasę. Nadal można by zrobić+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
Ostateczne wyjaśnienie tego od Apple znajduje się tutaj, w sekcji „Metody i wiadomości”:
W skrócie:
(metodę można wywołać bez wystąpienia instancji klasy). Nazywasz to tak:
[className classMethod];
Najpierw musisz utworzyć instancję obiektu, a następnie możesz wywołać metodę na obiekcie). Możesz ręcznie utworzyć instancję takiego obiektu:
SomeClass* myInstance = [[SomeClass alloc] init];
(to zasadniczo przydziela przestrzeń pamięci dla obiektu, a następnie inicjuje obiekt w tej przestrzeni - nadmierne uproszczenie, ale dobry sposób na myślenie o tym. Możesz przydzielić i zainicjować obiekt osobno, ale nigdy tego nie robisz - może to prowadzić do nieprzyjemnych problemów związanych ze wskaźnikami i zarządzanie pamięcią)
Następnie wywołaj metodę instancji:
[myInstance instanceMethod]
Alternatywny sposób uzyskania wystąpienia obiektu w celu C jest następujący:
NSNumber *myNumber = [NSNumber numberWithInt:123];
który wywołuje metodę klasy „numberWithInt” klasy NSNumber, która jest metodą „fabryczną” (tj. metodą zapewniającą „gotową instancję” obiektu).
Cel C pozwala również na tworzenie niektórych instancji obiektów bezpośrednio przy użyciu specjalnej składni, jak w przypadku takiego ciągu:
NSString * myStringInstance = @ "abc";