NSLog एक वस्तु की स्मृति पता ओवरराइड विवरण विधि में


116

मैं किसी वस्तु की वर्णन विधि को ओवरराइड कर रहा हूं। मुझे यह जानने की आवश्यकता है कि नीचे दिए कोड में {???} को बदलने के लिए ऑब्जेक्ट के मेमोरी एड्रेस को कैसे प्रिंट किया जाए :

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

मैं चाहता हूं कि यह इस तरह से कंसोल में प्रिंट हो:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages

जवाबों:


212

पता उपयोग %pप्रारूप प्रारूप और स्वयं सूचक को प्रिंट करने के लिए :

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}

6
'% @' विनिर्देशक के साथ स्वयं का उपयोग करना वास्तव में पुनरावृत्ति का कारण बनेगा क्योंकि -डिसक्रिप्शन विधि फिर से कॉल करेगा। % p निर्दिष्टकर्ता केवल सूचक पते को आउटपुट करता है
व्लादिमीर

3
मुझे [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];पता है - इसका पता वहां पर समाप्त हो गया है क्योंकि NSObjectइसमें है, लेकिन आपने जो कुछ भी तय किया है उसे फेंकना नहीं है, जो आपके द्वारा विरासत में प्राप्त किए जा रहे किसी भी सुपरक्लास में डिबगिंग के लिए प्रासंगिक है।
टॉमी

7
अतिरिक्त नोट: %pएक पॉइंटर के प्रकार की अपेक्षा करता है void *, आपको selfवापस कास्ट करना होगा void *, अन्यथा अपरिभाषित व्यवहार होता है।

4
@ user529758: कोई कास्ट करने की आवश्यकता नहीं, कोई अपरिभाषित व्यवहार नहीं। void *और idआंतरिक रूप से लगभग समान हैं, और इस मामले में कोई अंतर नहीं है कि आप इसे डालते हैं void *या नहीं।
माइकल

1
आपको 'स्व' तर्क से पहले 'और' प्रतीक रखना होगा
आर्टीम डेवैटोव

6

सबसे आसान तरीका सुपर विवरण का उपयोग करना है

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

तो इस मॉडल ऑब्जेक्ट के मामले में जो NSObject का उपवर्ग है, आप अतिरिक्त कार्य और याद रख सकते हैं %p

मैन्युअल रूप से NSStringWithClass () और% p का उपयोग करना

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}

तो एक वस्तु मॉडल के मामले में जिसमें आपके पास एक ठोस कार्यान्वयनकर्ता है जो इस वर्ग से प्राप्त होता है आप सही वर्ग नाम दिखाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.