2010-12-19 9 views
10

Ich weiß, dass Sie eine globale Variable in Objective-C definieren können, indem Sie "extern" verwenden, aber ich habe gerade festgestellt, dass die Variablen, die ich deklariert habe Top meiner .m-Datei vor meiner ersten Methode war auch versehentlich global (und das verursachte einige Probleme). Ich habe sie in den @interface-Teil meiner Header-Datei verschoben, was meiner Meinung nach richtigerweise nur in der Klasse existiert, was einige meiner Probleme gelöst hat, aber ich bin immer noch ein wenig verwirrt.Globale Variablen in Objective-C - Unterschied in extern und oben von .m Dateideklaration

Worin besteht der Unterschied darin, eine Variable als extern zu deklarieren und sie an die Spitze einer .m-Datei zu setzen? Oder ergeben sich diese in der gleichen Sache?

Antwort

25

extern ist eine Möglichkeit, ausdrücklich erklärt, um die Lesbarkeit und Kompilierung-Durchsetzung, dass Sie nur deklariert diese Variable hier, und erwartet, dass es tatsächlich an anderer Stelle definiert sein. Wenn Sie auch versuchen sollten, die externe Variable zu definieren, wird der Compiler Ihnen den Fehler Ihrer Wege mitteilen. Dies ist nützlich für globale Variablen, um eine Namenskollision und mehrere Definitionen zu verhindern, die beide zu Linkerfehlern führen. Das externe Schlüsselwort selbst macht die Variable jedoch nicht global.

Was macht die Variable global ist die Position ihrer Deklaration in der Datei. Wenn Sie eine Variable außerhalb der @ Schnittstelle in einer Header-Datei einer Klasse deklarieren würden, hätten Sie eine Variable definiert, die für alle Instanzen Ihrer Klasse freigegeben und sichtbar ist, sowie für jeden, der die Überschrift importiert. Wenn Sie eine Variable außerhalb der @implementation in Ihrer Klasse '.m-Datei deklarieren würden (und dies anscheinend auch getan haben), hätten Sie auch eine Variable deklariert, die von allen Instanzen Ihrer Klasse gemeinsam genutzt wird, aber für niemanden sichtbar ist #importiert den Header.

Verwenden Sie also die Position der Variablendeklarationen, um den Gültigkeitsbereich zu bestimmen. Sie werden nur definieren diese globalen Variablen an einem Ort. Für alle anderen Orte, die Sie deklarieren ihnen, die Deklaration mit extern vor, um den Code lesbar zu machen, Ihre Absichten klar, und um sicherzustellen, dass Sie nicht auch versuchen und definieren Sie es erneut.

+11

Kurze Version: extern bedeutet, dass es irgendwo existiert, aber nicht hier. Wenn Sie es nicht innerhalb von @interface oder @implementation haben, ist es global. – ughoavgfhw

+0

Tolle Erklärung, danke. –

+0

Danke für Ihre Hilfe! – Jackson