Risposte:
+è 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 .
@classmethode @methodo giù di lì, anche. Perché così conciso ...?
(+) 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];
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.
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; }
La spiegazione definitiva di questo da parte di Apple è qui, nella sezione "Metodi e messaggistica":
In breve:
(il metodo può essere chiamato senza istanza di un'istanza della classe). Quindi lo chiami così:
[className classMethod];
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";