Was bedeuten statische Variablen in einer Implementierung einer Schnittstelle?

68

Ich verstehe statische Variablen nicht ganz, wenn sie in der Implementierung einer Schnittstelle definiert werden. In Methoden verstehe ich, wie sie sich von lokalen Variablen unterscheiden, aber nicht, wenn sie direkt in einer Implementierung definiert werden.

Schau 'dir diese Beispiele an. Welchen Unterschied machen diese beiden praktisch?

#include "MyClass.h"

@implementation MyClass
int myInt;
...
@end

Und:

#include "MyClass.h"

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

myIntist in beiden Fällen für alle Methoden sichtbar, und wenn ich einen Test interpretiert habe, den ich korrekt ausgeführt habe, myIntist in beiden Fällen dieselbe Variable für verschiedene Instanzen der Klasse.

Quano
quelle

Antworten:

69

Das Schlüsselwort 'static' ist in diesem Kontext dasselbe wie in C: Es beschränkt den Umfang von myInt auf die aktuelle Datei.

smorgan
quelle
12
Das Definieren einer nicht lokalen Variablen innerhalb von @implementation unterscheidet sich nicht vom Definieren außerhalb.
Sigjuice
Aber macht dies wirklich einen Unterschied für Definitionen in Implementierungsdateien? Sie sind sowieso nicht enthalten.
Quano
8
Angenommen, Sie haben int Varibale deklariert. in zwei verschiedenen Implementierungsdateien. Beim Erstellen werden aufgrund doppelter Symbole Fehler angezeigt.
Denis Mikhaylov
1
Bedeutet dies, dass es als "privater" Zugriffsmodifikator fungiert?
Glesage
1
Nein. Das Schlüsselwort 'private' in C ++ fügt lediglich vom Compiler erzwungene Einschränkungen hinzu, wer auf eine Variable oder Methode zugreifen darf. 'static' bezieht es auf die Datei, in der es sich befindet, was sehr unterschiedlich ist.
Smorgan
88

Leider hat es unterschiedliche Auswirkungen, je nachdem, wo Sie es verwenden.

Statische Funktionen:
Standardmäßig haben alle Funktionen einen globalen Bereich. Mit dem statischen Bezeichner können Sie den Funktionsumfang auf die aktuelle Datei beschränken.

Statische lokale Variablen:
Wenn Sie den statischen Modifikator für eine lokale Variable verwenden, „merkt“ sich die Funktion ihren Wert über Aufrufe hinweg. Beispielsweise wird die Variable currentCount im folgenden Snippet nie zurückgesetzt. Anstatt die Anzahl in einer Variablen in main () zu speichern, können wir countByTwo () die Aufzeichnung für uns durchführen lassen.

// 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;
}

Diese Verwendung des statischen Schlüsselworts wirkt sich nicht auf den Umfang lokaler Variablen aus.
Lesen Sie mehr über das statische Schlüsselwort .

appsunited
quelle
7
Das statische Schlüsselwort erzwingt, dass seine Zeile NUR einmal für die gesamte Anwendungslaufzeit ausgeführt wird - unabhängig von der Anzahl der Aufrufe!
Honig
Wo im Speicher ist die statische Variable "currentCount" gespeichert? Es kann nicht im Frame von countByTwo sein, da dieser Frame beim Beenden der Funktion freigegeben wird. Wo wird es also aufbewahrt?
Enrique
@ Enrique in den gleichen Daten- / BSS-Bereichen, in denen die anderen "globalen" Variablen leben, es ist nur der Bereich, der lokal ist
BjörnW
21

"Sowohl in C als auch in Objective-C ist eine statische Variable eine Variable, die für die gesamte Lebensdauer eines Programms zugewiesen wird. Dies steht im Gegensatz zu automatischen Variablen, deren Lebensdauer während eines einzelnen Funktionsaufrufs besteht, und dynamisch zugewiesenen Variablen wie Objekten Einfacher ausgedrückt, der Wert einer statischen Variablen bleibt bei allen Funktions- / Methodenaufrufen erhalten. Wenn eine statische Variable außerhalb einer Funktion deklariert wird, ist sie für alles in der Datei sichtbar, in der sie sich befindet deklariert; wenn es innerhalb einer Funktion oder Methode deklariert wird, ist es nur innerhalb dieser Funktion oder Methode sichtbar, aber der Wert bleibt zwischen den Aufrufen erhalten. "

Die vollständige Erklärung finden Sie hier:

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

smileBot
quelle
17

Aus Apples "The Objective-C Programming Language": "Das Deklarieren einer statischen Variablen beschränkt ihren Gültigkeitsbereich nur auf die Klasse - und nur auf den Teil der Klasse, der in der Datei implementiert ist. (Daher können statische Variablen im Gegensatz zu Instanzvariablen nicht vererbt werden von oder direkt von Unterklassen manipuliert). "

c roald
quelle