2009-07-06 7 views
66

Non capisco le variabili statiche quando definito nell'implementazione di un'interfaccia. Nei metodi, capisco come si differenziano dalle variabili locali, ma non quando sono definite direttamente in un'implementazione.Qual è il significato delle variabili statiche in un'implementazione di un'interfaccia?

Guarda questi esempi. Che differenza fanno questi due praticamente?

#include "MyClass.h" 

@implementation MyClass 
int myInt; 
... 
@end 

E:

#include "MyClass.h" 

@implementation MyClass 
static int myInt; 
... 
@end 

myInt è in entrambi i casi visibili a tutti i metodi, e se ho interpretato un test mi sono imbattuto in modo corretto, myInt sarà in entrambi i casi è la stessa variabile per le diverse istanze di la classe.

+0

Vedi http://stackoverflow.com/a/4965145/654870 –

risposta

68

La parola chiave "statica" in quel contesto è la stessa che sarebbe in C normale: limita l'ambito di myInt al file corrente.

+12

Inoltre, la definizione di una variabile non locale all'interno @implementation non è diverso da definire fuori – sigjuice

+0

Ma questo fa davvero alcuna differenza per le definizioni nei file di implementazione?Non sono inclusi comunque. – quano

+8

Supponiamo che tu abbia dichiarato int Varibale; in due diversi file di implementazione. Otterrai errori al momento della compilazione, a causa di simboli duplicati. –

16

da Apple "The Objective-C Programming Language": "Dichiarazione di variabile statica limita il campo di applicazione al solo la classe - e solo la parte della classe che è implementato nel file (Così a differenza di variabili di istanza. , le variabili statiche non possono essere ereditate da, o direttamente manipolate da, sottoclassi). "

80

Sfortunatamente, ha effetti diversi a seconda di dove lo si utilizza.

funzioni statiche:
Per impostazione predefinita, tutte le funzioni hanno una portata globale. Lo specificatore statico consente di limitare l'ambito della funzione al file corrente.

variabili locali statiche:
Quando si utilizza il modificatore statico su una variabile locale, la funzione “ricorda” il suo valore attraverso invocazioni. Ad esempio, la variabile currentCount nello snippet seguente non viene mai ripristinata, quindi invece di memorizzare il conteggio in una variabile all'interno di main(), possiamo fare in modo che countByTwo() esegua la registrazione per noi.

// main.m 
#import <Foundation/Foundation.h> 

int countByTwo() { 
    static int currentCount = 0; 
    currentCount += 2; 
    return currentCount; 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSLog(@"%d", countByTwo()); // 2 
     NSLog(@"%d", countByTwo()); // 4 
     NSLog(@"%d", countByTwo()); // 6 
    } 
    return 0; 
} 

Questo uso della parola chiave statica non influisce sull'ambito delle variabili locali.
Maggiori informazioni su static keyword.

+6

La parola chiave static imporrà la sua riga di essere eseguita SOLO una volta per l'intero runtime dell'applicazione, indipendentemente dal numero di invocazioni! – Honey

+0

Dove nella memoria è memorizzata la variabile statica "currentCount"? Non può essere nel frame di countByTwo perché quella cornice viene deallocata quando termina la funzione. Quindi dove è memorizzato? – Enrique

16

"In C e Objective-C, una variabile statica è una variabile allocata per l'intera durata di un programma, in contrasto con le variabili automatiche, la cui durata esiste durante una singola chiamata di funzione e dinamicamente- allocate variabili come oggetti, che possono essere rilasciate dalla memoria quando non sono più utilizzate.Più semplicemente messo, il valore di una variabile statica è mantenuto in tutte le chiamate di funzione/metodo. Quando dichiarata al di fuori di una funzione, una variabile statica è visibile a tutto all'interno del file in cui è dichiarato, quando viene dichiarato all'interno di una funzione o metodo, è visibile solo all'interno di quella funzione o metodo, ma il valore viene mantenuto tra le chiamate. "

Scopri i spiegazione completa qui:

https://stackoverflow.com/a/4965145/951349