2009-10-14 22 views
5

Her ikisi de örnek değişkenlerini tanımlayan bir üst sınıfı ve bir alt sınıfa sahibim. superclassAmaç-C: hata ayıklayıcısında kapsam dışı örnek değişkenler

Kaba taslak: alt sınıfının

/* GenericClass.h */ 
@interface GenericClass : NSObject { 
    /* some variables */ 
} 
@end 
/* GenericClass.m */ 
@implementation GenericClass 
    /* ... */ 
@end 

Anahat:

/* SpecificClass.h */ 
#import "GenericClass.h" 
@interface SpecificClass : GenericClass { 
    NSMutableString *str; 
} 
/* SpecificClass.m */ 
#import "SpecificClass.h" 
@implementation SpecificClass 
- (void)aMethod { 
    //Debugger reports str as out of scope 
    str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Works fine: 
    self->str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Doesn't compile as I haven't defined @property/@synthesize: 
    self.str = [[NSMutableString alloc] initWithCapacity:100]; 
} 

Ben NSObject doğrudan devralan sınıfları kullanıyorum, bir öz> işaretçi ihtiyacı yoktur. Ana GenericClass'da tanımlanmış str adıyla hiçbir nesne bulunmadığını unutmayın. Öyleyse, sorum şu ki, self-> str olarak başvurulmadığında neden kapsam dışı kalıyor? Kod kendi içinde çalışır, ancak ben debugger

cevap

7

GDB bir Objective-C derleyicisi ile değişkeni okuyamıyorum. Derleyici, Objective-C yöntemleri içinde sözcük kapsamı gibi şeyleri bilir, ancak GDB bunu yapmaz. Bununla birlikte, yerel değişkenleri anlıyor.

Objective-C'de, her yöntemin, arandığında kendisine verilen örtülü bir self parametresi vardır. Yani, self->str'a baktığınızda GDB, başka bir yerel değişken değerlendirmesini yorumlayacağı gibi yorumluyor.

str'u kendi başına değerlendirmeye çalıştığınızda, GDB, str adlı yerel bir değişken arayacak ve bir tane bulunamadığını, kapsamda olmadığını bildirecektir. Bu bir hata değil; beklenen davranış budur.

+0

Bu GDB'nin nasıl çalıştığına dair iyi bir açıklamadır, teşekkürler! Ama hala beni kafa karıştırıcı bir şey var. Üst sınıfta tanımlanan değişkenler var; Bir NSMutableString * superstr diyelim. SpecificClass uygulamasında kendi başına "superstr" referansı iyi çalışıyor. Ancak SpecificClass.h dosyasında tanımlanan bir "str" ​​değişkenine erişmeye çalışmak, self-> kullanmadan hata ayıklayıcıda çalışmaz. GDB kalıtsal bir değişkeni nasıl buluyor, fakat bu sınıfın kendi başlığında tanımlanmış olanı değil? Eğer miras kullanmıyorsam, bu da gayet güzel çalışıyor. XCode –

+1

Denemesi "Debugger Console" penceresinde (⇧⌘R) "str" ​​ve "po superstr" öğelerinde bir hata gibi görünüyor. Aynı sonuçları verirse, sorunun Xcode ile ilgisi yoktur (muhtemelen). –

+1

İşin tuhafı, po str ve po superstr konsolda iyi çalışır, çünkü kendinden> str ve po self-> superstr. Sadece görsel hata ayıklama kullanıcı arabiriminde, kendini kullanmayan str değişkeninin, fareyle birlikte taşınırken kapsam dışı kalması, ancak koddaki okuma/yazma işlemleri gayet iyi çalışıyor. Apple ile bir hata olarak günlüğe kaydederim. Bu arada ben her yerde (kullanmamayı tercih etsem de) kullanıyorum, böylece görsel olarak hata ayıklayabiliyorum. –

İlgili konular