ওভাররাইড বর্ণনা পদ্ধতিতে কোনও বস্তুর মেমরি ঠিকানা NSLog করুন


116

আমি কোনও অবজেক্টের বর্ণনা পদ্ধতিতে ওভাররাইড করছি। নীচের কোডটিতে {??? replace প্রতিস্থাপনের জন্য কীভাবে আমি অবজেক্টটির মেমরি ঠিকানা মুদ্রণ করব তা জানতে হবে :

-(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
'% @' স্পেসিফায়ারের সাথে স্ব ব্যবহার করা প্রকৃতপক্ষে পুনরাবৃত্তি ঘটায় কারণ এটি আবার-বিবরণ পদ্ধতি কল করবে will % পি নির্দিষ্টকারী কেবল পয়েন্টার ঠিকানা আউটপুট দেয়
ভ্লাদিমির

3
আমি ঝোঁক [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- ঠিকানাটি এখানেই শেষ হয়ে যায় কারণ NSObjectএটি রয়েছে তবে আপনি যে সিদ্ধান্ত নিয়েছেন তা যে কোনও সুপারক্লাসে ডিবাগ করার ক্ষেত্রে প্রাসঙ্গিক তা আপনি ফেলেও দেবেন না।
টমি

7
অতিরিক্ত নোট: %pধরণের বিন্দু প্রত্যাশা করে void *, আপনাকে selfআবার কাস্ট করতে হবে void *, অন্যথায় সংজ্ঞায়িত আচরণ ঘটে।

4
@ ব্যবহারকারী529758: castালাই করার দরকার নেই, কোনও অপরিজ্ঞাত আচরণ নেই। void *এবং idঅভ্যন্তরীণভাবে প্রায় একই, এবং এই ক্ষেত্রে আপনি এটি নিক্ষেপ করেছেন void *বা না করেন তাতে কোনও পার্থক্য নেই।
মাইকেল 10

1
আপনাকে 'স্ব' যুক্তির আগে '&' চিহ্ন রাখতে হবে
আর্টিয়াম দেবযাতভ

6

সবচেয়ে সহজ পদ্ধতি হ'ল সুপার বর্ণনাটি ব্যবহার করা

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

সুতরাং এই মডেল অবজেক্টের ক্ষেত্রে যা এনএসবজেক্টের একটি সাবক্লাস, আপনি অতিরিক্ত কাজ এবং স্মরণে ডজ করতে পারেন %p

ম্যানুয়ালি NSStringWithClass () এবং% p ব্যবহার করছে

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

সুতরাং এমন কোনও অবজেক্ট মডেলের ক্ষেত্রে যেখানে আপনার কাছে একটি কংক্রিট প্রয়োগকারী রয়েছে যা এই শ্রেণি থেকে নেওয়া হয়েছে আপনি সঠিক শ্রেণীর নামটি প্রদর্শন করবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.