Cosa significano i segni più e meno in Objective-C accanto a un metodo?


180

In Objective-C, vorrei sapere cosa significano i segni +e -accanto a una definizione del metodo.

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

Risposte:


226

+è per un metodo di classe ed -è per un metodo di istanza.

Per esempio

// 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".

C'è un'altra domanda che riguarda la differenza tra metodi di classe e di istanza .


63
È quasi come se i cinque personaggi extra di "statico" fossero in qualche modo troppo per loro.
Anon.

23
@Anon: i metodi non sono statici. Sono metodi di classe. Possono essere sostituiti e fanno parte della gerarchia di classi. statico implica qualcosa di molto diverso in C.
bbum

4
@Avon, è una mela per te, lasceranno fuori anche un flash sulla fotocamera e un pulsante destro sui topi. =)
pokstad

13
@bbum è sui soldi. Il fatto che Java abbia riappropriato la parola chiave "statica" per significare qualcosa di diverso non è colpa del molto più vecchio C. Mentre il suo utilizzo potrebbe non essere del tutto intuitivo in C, sembra ancora meno in Java. Mi aspetto che l'elettricità statica sia l'opposto della dinamica, qualcosa che non cambia. E, naturalmente, il linguaggio Objective-C esisteva da circa 15 anni prima che Apple lo adottasse in OS X.
Quinn Taylor

3
La differenza tra metodo statico e metodo di classe: definire il metodo + pippo in MYBaseClass e la sua sottoclasse MYSubClass. NSArray * classes = @ [[classe MYBaseClass], [classe MYSubClass]]; [classi makeObjectsPerformSelector: @selector (foo)]; Non funzionerebbe con un metodo statico. Detto questo, io preferivo would'a un @classmethode @methodo giù di lì, anche. Perché così conciso ...?
uliwitness

45

(+) per i metodi di classe e (-) per il metodo di istanza,

(+) Metodi di classe: -

Sono metodi dichiarati come statici. Il metodo può essere chiamato senza creare un'istanza della classe. I metodi di classe possono operare solo sui membri di classe e non sui membri di istanza poiché i metodi di classe non sono a conoscenza dei membri di istanza. I metodi di istanza della classe non possono inoltre essere richiamati all'interno di un metodo di classe a meno che non vengano chiamati su un'istanza di quella classe.

(-) Metodi di istanza: -

D'altra parte, è necessario che esista un'istanza della classe prima di poter essere chiamata, quindi è necessario creare un'istanza di una classe utilizzando la nuova parola chiave. I metodi di istanza operano su istanze specifiche di classi. I metodi di istanza non sono dichiarati come statici.

Come creare?

@interface CustomClass : NSObject

+ (void)classMethod;
- (void)instanceMethod;

@end

Come usare?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

I metodi + sono metodi di classe, ovvero metodi che non hanno accesso alle proprietà di un'istanza. Utilizzato per metodi come metodi alloc o helper per la classe che non richiedono l'accesso alle variabili di istanza

- i metodi sono metodi di istanza - si riferiscono a una singola istanza di un oggetto. Solitamente utilizzato per la maggior parte dei metodi su una classe.

Vedi le specifiche della lingua per maggiori dettagli.


Bene, in realtà i metodi di classe hanno accesso alle variabili di istanza, semplicemente non hanno un'istanza come self, ma piuttosto la classe. Semplicemente non sono associati a un'istanza e la ricerca del metodo non avviene attraverso l'istanza, ma attraverso la classe. Tuttavia, potresti fare+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness

5

La spiegazione definitiva di questo da parte di Apple è qui, nella sezione "Metodi e messaggistica":

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

In breve:

+ significa "metodo di classe"

(il metodo può essere chiamato senza istanza di un'istanza della classe). Quindi lo chiami così:

[className classMethod]; 


- significa "metodo di istanza"

Devi prima istanziare un oggetto, quindi puoi chiamare il metodo sull'oggetto). È possibile creare un'istanza manualmente di un oggetto come questo:

SomeClass* myInstance = [[SomeClass alloc] init];

(questo alloca essenzialmente lo spazio di memoria per l'oggetto, quindi inizializza l'oggetto in quello spazio - una semplificazione eccessiva ma un buon modo di pensarci. È possibile allocare e avviare l'oggetto separatamente ma mai farlo - può portare a cattivi problemi relativi ai puntatori e gestione della memoria)

Quindi chiama il metodo di istanza:

[myInstance instanceMethod]

Un modo alternativo per ottenere un'istanza di un oggetto nell'Obiettivo C è il seguente:

NSNumber *myNumber = [NSNumber numberWithInt:123];

che sta chiamando il metodo della classe 'numberWithInt' della classe NSNumber, che è un metodo 'factory' (ovvero un metodo che fornisce un''istanza già pronta 'di un oggetto).

L'obiettivo C consente anche la creazione di determinate istanze di oggetti usando direttamente una sintassi speciale, come nel caso di una stringa come questa:

NSString * myStringInstance = @ "abc";

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.