2009-02-27 7 views
0

i eine globale Variable wie classA.h in 1 der KlasseProblem mit declare eine globale Variable in Objective C

const NSString *global; 

classA.m

global=[array objectAtIndex:0];//a array store sort of string 

und in einer anderen Klasse ich will Diese globale Variable zu nennen

classB.m

import "class.h" 

NSLog(@"%@",global); 

aber es funktioniert nicht, ich weiß, wenn ich nur einen Wert direkt auf meine globale Variable statt von einer anderen Variable zugewiesen wurde, wird es funktionieren, aber kann mir jemand zeigen, wie es aus einem Array zu erreichen?

+1

Ich schlage vor, Sie überdenken mit einer globalen Variablen. es gibt wahrscheinlich eine bessere Alternative. Wenn Sie jemals mit diesen Klassen gleichzeitig programmieren, werden Sie es bereuen, eine globale Variable zu verwenden. – sebnow

Antwort

3

in der Kopfzeile verwenden:

extern const NSString *global; 

und bei der Umsetzung (.m):

const NSString *global; 

Die "extern" Referenz sagt alle, einschließlich Dateien, die die Variable existiert, aber es erklärt anderswo. Schließlich fügen Sie in Ihrer Implementierungsdatei die eigentliche Deklaration ein.

+1

Am besten verwenden Sie NSString * const global, da der Compiler Sie dann nicht warnt, wenn Sie einen const-Zeiger an einen NSString als Parameter an eine Methode übergeben, die einen nichtkonstanten Zeiger auf einen NSString erwartet. – dreamlax

+0

danke NilObject aber ich denke, das Problem, das ich hatte ist, wie der Wert der globalen Variablen von einem Array-Objekt zugewiesen, kann mir einige der Beispiel zeigen – issac

+0

Ihr Beispiel funktioniert mit meinen Änderungen an der globalen Variablendeklaration, aber Sie behalten nicht ein Verweis auf das Objekt, sodass es zerstört werden kann, wenn das Array nicht mehr existiert. – NilObject

1

Sie können das nicht so machen.

const NSString *global; 
NSString const *global; 

bedeutet sowohl einen Zeiger auf einen konstanten NSString Objekt (das geändert werden kann). In Objective-C machen konstante Objekte keinen Sinn. Der Compiler kann die Konsistenz von Objekten nicht erzwingen. Es kann nicht wissen, ob eine Methode den internen Zustand eines Objekts ändert oder nicht. Außerdem nehmen alle Klassen in der Bibliothek immer Zeiger auf nicht konstante Objekte als Parameter für ihre Methoden, so dass alle const Objektzeiger eine Menge Warnungen verursachen.

Auf der anderen Seite gibt es konstante Zeiger auf Objekte, die wie folgt erklärt werden:

NSString * const global; 

Dies bedeutet, dass die Zeiger zeigen auf ein reguläres NSString Objekt, aber es ist Wert kann nicht verändert werden. Dies bedeutet, dass Sie auch den Wert des Zeigers initialisieren müssen (er kann später nicht mehr geändert werden). Dies wird verwendet, um Konstanten zu definieren. Aber das funktioniert nur mit NSStrings und String-Literalen. Für alle anderen Klassen gibt es keine Möglichkeit, ein Konstantenobjekt zur Kompilierungszeit anzugeben, das für die Initialisierung benötigt wird. Und in diesem Fall ist es eine wahre Konstante - String-Literale sind per Definition unveränderlich.

Aber in Ihrem Fall können Sie die const beseitigen. Sie möchten den Zeiger später ändern, so dass es kein NSString * const sein kann. Wenn Sie auf einem globalen bestehen, müssen Sie es nur zu einem normalen NSString * machen. Auf der anderen Seite - Globals sind böse. Sie sollten Ihr Design ändern, damit Sie es nicht brauchen.