2012-01-10 28 views
12

main.m dosyasındaki bir değişkeni, tüm sınıflarda kullanılabilmesi için nasıl bildirebilirim?object-c - genel değişkenler

Basitçe main işlevinde bildirirseniz, derleyici sınıf yönteminde bildirilmemiş olduğunu belirtir.

Bunu böyle bir nesnede beyan etmeliyim?

@public 
type variable; 

cevap

25

Tek ihtiyacınız olan düz eski C genel değişkenlerini kullanmaktır.

İlk olarak, main işlevi önce senin main.m bir değişken tanımlamak:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

İkinci, diğer kaynak dosyaları bu konuda bildirmek gerekir. aksi takdirde bunun bir tanım olur sen beyanı bloğunda değişkene bir değer atanamıyor

// .h file 

// Declaration of your variable.  
extern type variable; 

Not: Eğer sizin değişken ihtiyaç .m dosyaları bazı .h dosyasında beyan ve tüm bu dosyayı içe gerekir değişkeni ve aynı adın birden çok tanımından şikayetçi olan linker hatası ile biter. Her bir değişken (Deklarasyonu bu değişken bir yerde var olduğunu söylüyor) defalarca bildirilmiş olabilir, ama (tanım aslında bu değişken için bellek oluşturur) sadece bir kez tanımlamıştır:

Açıkça ifade etmek gerekirse.

Ancak, global değişkenler kötü bir kodlama uygulamasıdır, çünkü bunların değerleri beklenmedik biçimde herhangi bir dosyada değiştirilebildiğinden, hata ayıklama hatalarıyla karşılaşabilirsiniz. Örneğin, Singleton desenini kullanarak global değişkenlerden kaçınabilirsiniz.

+0

Imo, küresel değişkenler aslında Objective C anlamda bir sürü yapmak, eğilim verilen:

izleyin bu bağlantıyı sabitleri ve statik değişkenler hakkında daha fazla bilgi edinmek için singletons, özellikle denetleyicileri görüntüleyin. Bu durumda değişkenlerden daha çok sabitler gibi davranırlar. – devios1

+0

Aslında, bekarlar, global bir değişken kullanır - paylaşılan örnek - böylece her üye global hale gelir; Sadece bir tür küreselliği başka biriyle değiştiriyorsun. – Cristik

10

Neden bunu yapmak istediğinizden emin değilsiniz, ancak isterseniz isteyebilirsiniz.

main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

Fakat, böyle bir şey kullanmadan başlamadan önce iyice düşünün lütfen!

+0

Neden dikkatli olun? Riskin ne olacağını anlamıyorum – Sirens

+1

Risk, sürdürülemez kod olabilir veya hataları izlemek için zor olabilir. – mattjgalloway

+0

İnternette global vars hakkında gördüğüm her gönderide "dikkatli olmak" ve "neden dikkatli olun" diyen bazı insanlar var. Haha, her zaman aynı Jazz. dikkatli olmak istemiyoruz kişiler: Başkalarının tekrar tekrar uyarıyor demektir neden gizli nedeni olması gerektiğini düşünüyorum;) – tothemario

2

Hata ayıklama dışında, uygulama mantığınızla doğrudan etkileşimde bulunmak için main.m dosyasını bile denemek ve değiştirmek için bir neden göremiyorum.

Gereksinimlerinize uygun bir şekilde Your_project_name_Prefix.pch dosyasında bir sabit tanımlamaya çalışabilirsiniz. Veya uygulama temsilcisine veya uygulamanızın sınıflarından herhangi birine statik bir değişken bildirin. doğal olarak bir çok şey için

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

Ama var okuma yazma erişimi gerekirse bu, çalışmaz. E. g. Tüm sınıflar için erişilebilir bir şifre veya oturum kimliği saklamak istiyorsanız. –