Co oznaczają znaki plus i minus w Objective-C obok metody?

180

W Objective-C chciałbym wiedzieć, co oznaczają znaki +i -obok definicji metody.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;
Gyurisc
źródło

Odpowiedzi:

226

+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 .

Georg Schölly
źródło
62
To prawie tak, jakby dodatkowe pięć znaków „statycznych” było jakoś dla nich za dużo.
Anon.
23
@Anon: Metody nie są statyczne. Są to metody klasowe. Można je zastąpić i stanowią one bardzo część hierarchii klas. static oznacza coś zupełnie innego w C.
bbum
4
@ Avon, to jabłko dla ciebie, pominą też lampę błyskową w aparacie i prawy przycisk myszy. =)
pokstad
13
@bbum jest na pieniądzach. Fakt, że Java ponownie zawłaszczyła słowo „statyczne”, aby oznaczać coś innego, nie jest winą znacznie starszego C. Chociaż jego użycie może nie być całkowicie intuicyjne w C, wydaje się jeszcze mniej w Javie. Spodziewałbym się, że statyczność będzie przeciwieństwem dynamiki - coś, co się nie zmieni. Oczywiście język Objective-C istniał już prawie 15 lat, zanim Apple go wprowadził w OS X.
Quinn Taylor
3
Różnica między metodą statyczną a klasową: Zdefiniuj metodę + foo w MYBaseClass i jej podklasie MYSubClass. NSArray * klas = @ [[klasa MYBaseClass], [klasa MYSubClass]]; [klasy makeObjectsPerformSelector: @selector (foo)]; Nie działałby z metodą statyczną. Powiedział, że would'a wolałem @classmethodi @methodczy tak, też. Dlaczego tak zwięzły ...?
uliwitness
45

(+) 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];
Vandit Mehta
źródło
18

+ 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 .

Robert Christie
źródło
Cóż, w rzeczywistości metody klasowe mają dostęp do zmiennych instancji, po prostu nie mają instancji jako 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; }
uliwitness
5

Ostateczne wyjaśnienie tego od Apple znajduje się tutaj, w sekcji „Metody i wiadomości”:

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

W skrócie:

+ oznacza „metodę klasową”

(metodę można wywołać bez wystąpienia instancji klasy). Nazywasz to tak:

[className classMethod]; 


- oznacza „metodę instancji”

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";

Chris Halcrow
źródło