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 .
@classmethod
e @method
o 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";