2012-08-17 23 views
7
@interface Foo : NSObject 

{ 
    extern int gGlobalVar; 
    int i; 
} 
-(void)setgGlobalVar:(int)val; 

@end 


@implementation Foo 

-(void)setgGlobalVar:(int)val 
{ 
    i = 5; 
    NSLog(@"i = %i", i); 
    gGlobalVar = val; 
} 

@end 

Arabirimde i bildirebilir ve uygulamada herhangi bir hata olmadan kullanabilirsiniz. Ancak, arayüzde extern türünde bir değişken bildiremiyorum. Bu neden böyle? Neden bir hata mesajı alıyorum: "Tür adı, depolama sınıfının belirtilmesine izin vermiyor"?tip adı, depolama sınıfının belirtilmesine izin vermiyor

cevap

13

Kısa Açıklama: arasında parantez bölüm sınıf en @interface VEYA @implementation örnek değişkenleri (aka "ivar") ilan içindir. extern anahtar kelimesi yalnızca küresel değişken bildirimleri ile kullanım içindir (veya fonksiyonlar, ama bu başka bir konu.)
nedenle, extern ivar ilan edilemez.

Gritty Ayrıntıları: Değişkenler önce bildirilir ve sonra tanımlanır. Bu ayrım, genellikle yerel kapsamlardaki değişkenler için bulanıktır, çünkü açık bir tanımı olmayan yerel olarak bildirilen bir değişken genellikle tahsis edilir ve derleyici tarafından bir varsayılan değer verilir.

Küresel değişkenler kapsam küresel varlığından haberdar olması koşuluyla, herhangi bir kapsamda potansiyel mevcuttur. Anahtar kelime extern burada devreye girer - bu küresel değişkeni var olduğunu beyan ve başka yerde tanımlandı. Bu, yalnızca farklı kod dosyalarındaki bir genel değişkene erişmek istediğinizde kullanışlıdır.

İyi Uygulamalar: Kitabınız bir uygulama dosyasında bir extern değişkeni (örn. ".m" dosyaları, vb) ... bu olabilir beyan bazı kodu vardır, ancak çünkü kötü bir uygulamadır Küresel olarak gerçekte başka bir yerde geçerli bir tanıma sahip olup olmadığına dair, potansiyel olarak kötü varsayımlar yapmak. (Ancak, fantezi derleyicileri bu tür bir hatayı keşfedecektir.) Bunun yerine, en iyi uygulama, bir üstbilgi dosyasında bir dış değişkenin bir kez bildirilmesi, bu başlıktaki öğeleri tanımlamaya adanmış bir uygulama dosyasına sahip olmaktır. sonra bu üstbilgiyi, global değişkeni kullanmak isteyen diğer uygulama dosyalarına dahil edin. Yanıtınız HachiEthan için

+0

teşekkürler. Tesadüfen, atıfta bulunduğum kitap, '.m' dosyasında 'extern' kullanmıştır. –

+0

@Rut Biraz önce bir araştırma yaparak, daha önce extern'in cesurluğunu kazmadım! (Ve şimdiki işimde bana yardımcı olacak.) Yakında cevap güncellemesi olacak. =) – MechEthan

+0

Gerçekten takdir et HachiEthan! –

İlgili konular