2009-10-14 9 views
5

में दायरे से बाहर आवृत्ति चर मेरे पास एक सुपरक्लास और सबक्लास है, जिसमें से दोनों आवृत्ति चर परिभाषित करते हैं। सुपर क्लास कीउद्देश्य-सी: डीबगर

असहज रूपरेखा:

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

उपवर्ग की रूपरेखा:

/* 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]; 
} 

जब मैं वर्गों है कि NSObject से सीधे वारिस उपयोग कर रहा हूँ, एक आत्म> सूचक जरूरत नहीं है। ध्यान दें कि पैरेंट जेनेरिक क्लास में परिभाषित नाम स्ट्र के साथ कोई ऑब्जेक्ट नहीं है। तो, मेरा सवाल यह है कि, आत्म-> str के रूप में संदर्भित नहीं होने पर स्कोप से बाहर क्यों है? कोड स्वयं काम करता है, लेकिन मैं डीबगर

उत्तर

7

जीडीबी एक उद्देश्य-सी संकलक नहीं है। कंपाइलर उद्देश्य-सी विधियों के भीतर शब्दावली के दायरे जैसी चीज़ों के बारे में जानता है, लेकिन जीडीबी नहीं करता है। हालांकि, यह स्थानीय चर को समझता है।

उद्देश्य-सी में, प्रत्येक विधि में एक अंतर्निहित self पैरामीटर होता है जब इसे कहा जाता है। तो जब आप self->str देखते हैं, तो जीडीबी व्याख्या कर रहा है कि यह किसी अन्य स्थानीय परिवर्तनीय मूल्यांकन की व्याख्या करेगा।

जब आप अपने आप पर str का मूल्यांकन करने का प्रयास करते हैं, तो जीडीबी str नामक स्थानीय चर की तलाश करेगा और एक नहीं ढूंढता है, यह रिपोर्ट करता है कि यह दायरे में नहीं है। यह एक त्रुटि नहीं है; यह अपेक्षित व्यवहार है।

+0

यह एक अच्छा स्पष्टीकरण है कि जीडीबी कैसे काम करता है, धन्यवाद! लेकिन अभी भी एक बात है जो मुझे भ्रमित कर रही है। मेरे पास superclass में परिभाषित चर है; आइए एक एनएसएमयूटेबल स्ट्रिंग * सुपरस्ट्र को कॉल करें। विशिष्ट क्लास के कार्यान्वयन में अपने आप पर "सुपरस्ट्र" का एक संदर्भ ठीक काम करता है। लेकिन विशिष्ट क्लास.h में परिभाषित एक चर "str" ​​तक पहुंचने का प्रयास स्वयं-> का उपयोग किये बिना डीबगर में काम नहीं करता है। जीडीबी को विरासत चर कैसे मिलता है, लेकिन इस वर्ग के अपने शीर्षलेख में परिभाषित नहीं किया गया है? अगर मैं विरासत का उपयोग नहीं कर रहा हूं, तो यह भी ठीक काम करता है। यह XCode –

+1

में एक बग की तरह लगता है डीबगर कंसोल विंडो (⇧⌘R) में 'po str' और 'po superstr' आज़माएं। यदि वे एक ही परिणाम देते हैं, तो समस्या के पास एक्सकोड (जो संभवतः) के साथ कुछ लेना देना नहीं है। –

+1

विचित्र रूप से पर्याप्त, पीओ स्ट्र और पीओ सुपरस्ट्र कंसोल में ठीक काम करते हैं, जैसे पीओ स्वयं-> str और po self-> superstr। यह केवल दृश्य डीबग यूआई में है जहां माउस के साथ स्थानांतरित होने पर स्कोप से बाहर होने वाली रिपोर्ट - लेकिन कोड के काम में पढ़ना/लिखना ऑपरेशन ठीक है। मैं इसे ऐप्पल के साथ एक बग के रूप में लॉग करूंगा। इस बीच मैं स्वयं-> हर जगह (हालांकि मैं नहीं करना चाहूंगा) का उपयोग कर रहा हूं ताकि मैं दृष्टि से डीबग कर सकूं। –