Che cos'è un metodo statico rispetto ai metodi instance / class / private / public?

3

Sto imparando la programmazione in Objective-C e non riesco a capire cosa sia un metodo statico. So che classe / istanza / metodi privati / pubblici sono. Qualcuno può spiegare che cosa sta usando un esempio e confrontarlo con gli altri che ho citato? E in quale situazione qualcuno lo userebbe?

Da quanto ho letto su Wikipedia , sembra un metodo di classe che non può accedere a nulla in% codice%. Mi sembra una funzione autonoma, che non dovrebbe essere associata a nessuna classe in primo luogo, poiché non può accedere a self .

    
posta guptron 25.03.2013 - 15:19
fonte

3 risposte

3

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.

    
risposta data 25.03.2013 - 16:08
fonte
3

Sì, un metodo di classe statico appartiene a una classe ma non a un oggetto specifico di questa classe. Quindi non può accedere a nessun dato in un oggetto.

I metodi statici vengono utilizzati per fornire funzionalità a livello di classe. Questi dovrebbero ovviamente essere ancora legati a questa classe. Ci sono molti motivi per cui potresti usare questo. Ad esempio potresti avere una classe che ha bisogno di molti parametri per la creazione dell'oggetto e vuoi avere alcune "impostazioni predefinite", quindi dovresti scrivere un metodo statico che restituisca un oggetto della classe. O vuoi metodi che funzionino su liste di oggetti come ad esempio chiamare i loro metodi di stampa.

    
risposta data 25.03.2013 - 15:26
fonte
-1

La risposta di Caleb è molto accurata, ma il fatto di non essere in grado di creare istanze senza metodi di classe non è del tutto vero. Objective-C essendo un linguaggio ibrido e tutto, puoi sicuramente creare istanze senza metodi di classe.

Un modo semplice è chiamare [NSAllocateObject (NSClassFromString (@ "NSObject"), 0, NULL) init];

Sostituisci altre classi a piacere. Ovviamente puoi ottenere la classe usando altri mezzi, e se vuoi puoi semplicemente calloc () un pezzo di memoria e aggiungere il puntatore della classe.

    
risposta data 25.03.2013 - 18:39
fonte

Leggi altre domande sui tag