I'm learning programming in Objective-C and I can't understand what a static method is.
L'obiettivo-C non ha "metodi statici". Inoltre non ha metodi privati. Ha metodi di classe (contrassegnati con +
) e metodi di istanza (contrassegnati con -
). I metodi di classe sono simili ai metodi statici in C ++ in quanto è possibile chiamarli senza avere un'istanza della classe che li definisce, quindi mi aspetto che tu stia chiedendo dei metodi di classe e del motivo per cui sono utili.
In Objective-C, le classi stesse sono un tipo di oggetto ed è possibile inviare loro messaggi proprio quando si inviano messaggi a un'istanza di una classe (sebbene i messaggi che è possibile inviare siano diversi). I metodi Class vengono utilizzati ogni volta che si desidera che la classe esegua qualcosa ma non abbia un'istanza della classe. Sono spesso usati per ottenere o creare istanze della classe. Un esempio perfetto è il metodo +alloc
. +alloc
crea un'istanza di una classe allocando memoria per quell'istanza; spetta a te inizializzare l'istanza con un inizializzatore appropriato:
Foo *f = [[Foo alloc] initWithBar:bar];
Qui inviamo il messaggio alloc
all'oggetto che è la classe Foo stessa per creare una nuova istanza di Foo. Quindi inviamo il messaggio initWithBar:
alla nuova istanza per inizializzarlo con l'oggetto bar
.
Allo stesso modo, i metodi di classe sono spesso usati come "costruttori di convenienza" per creare un oggetto in un passo piuttosto che i due sopra:
NSString *s = [NSString stringWithFormat:@"%f", someFloat];
Qui semplicemente inviamo un messaggio alla classe NSString (ricorda che le classi sono esse stesse oggetti) e recupera una stringa correttamente inizializzata.
Senza i metodi di classe, non ci sarebbe modo di creare istanze di classi.
A volte una classe gestisce l'accesso a un'istanza condivisa di se stessa. In questi casi, la classe fornisce spesso un metodo per recuperare quell'oggetto condiviso:
NSFileManager *fileManager = [NSFileManager defaultManager];
La maggior parte delle volte non è necessario creare la propria istanza NSFileManager: è sufficiente utilizzare l'oggetto condiviso. Avere la classe NSFileManager gestire tale oggetto ha senso - è facile capire come ottenere l'istanza condivisa, e il modo in cui viene gestito il gestore di file condivisi può cambiare con l'implementazione delle modifiche di NSFileManager.
From what I read on Wikipedia, it sounds like a class method that
can't access anything in self.
self
è valido in un metodo di classe, ma fa riferimento all'oggetto classe e non a qualsiasi istanza della classe. Quindi hai ragione che non puoi accedere ad alcuna variabile di istanza all'interno di un metodo di classe, ma ciò non significa che il messaggio debba essere una "funzione autonoma" del tutto estranea alla classe.