2010-01-19 4 views

risposta

178

+ è un metodo di classe e - è un metodo di istanza.

E.g.

// 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'è another question dealing with the difference between class and instance methods.

+47

È quasi come se i cinque caratteri extra di "statico" fossero in qualche modo troppo per loro. –

+2

Collegamento a documenti: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12-TPXREF122 – Seth

+0

@Seth: Grazie, stavo cercando quel link ma non l'ho trovato. –

17

+ I metodi sono metodi di classe, ovvero metodi che non hanno accesso a proprietà di istanze. Utilizzato per metodi come i 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.

Vedere il numero Language Specification per ulteriori dettagli.

+0

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, si potrebbe fare '+ exchangeIVarOf: (MYObject *) a con: (MYObject *) b {MYObject * x = a-> ivar; a-> ivar = b-> ivar; b-> ivar = x; } ' – uliwitness

31

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

(+) metodi di classe: -

sono metodi che vengono dichiarati come statico. Il metodo può essere chiamato senza creare un'istanza della classe. I metodi di classe possono operare solo sui membri della classe e non sui membri dell'istanza, poiché i metodi di classe non sono a conoscenza dei membri dell'istanza. Non è possibile chiamare i metodi di istanza della classe 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 richiedono un'istanza della classe di esistere prima che possano essere chiamati, in modo da un'istanza di una classe deve essere creata utilizzando la nuova parola chiave. I metodi di istanza operano su istanze specifiche di classi. I metodi di istanza non sono dichiarati come statici.

4

La spiegazione definitiva di questo da parte di Apple è qui, sotto il 'Metodi e Messaging' sezione:

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 un'istanza della classe istanziata). Così si chiama in questo modo:

[className classMethod]; 


- significa 'metodo di istanza'

È necessario creare un'istanza di un oggetto prima, allora si può chiamare il metodo sull'oggetto).È possibile creare un'istanza manualmente un oggetto come questo:

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

(questo assegna essenzialmente spazio di memoria per l'oggetto poi initalises l'oggetto in quello spazio - una semplificazione eccessiva, ma un buon modo di pensare a questo proposito È possibile alloc e init. l'oggetto separatamente ma mai fare questo - può portare a problemi di cattivi legati alla puntatori e gestione della memoria)

quindi chiamare il metodo di istanza:

[myInstance instanceMethod] 

Un modo alternativo per ottenere un'istanza di un oggetto in Objective C è come questo:

NSNumber *myNumber = [NSNumber numberWithInt:123]; 

che chiede la 'numberWithInt' metodo di classe della classe NSNumber, che è un metodo di 'fabbrica' (vale a dire un metodo che ti fornisce una "istanza pronta" di un oggetto).

Objective C permette inoltre la creazione di alcune istanze di oggetti direttamente utilizzando la sintassi speciale, come nel caso di una stringa come questa:

NSString * myStringInstance = @ "abc";