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
การใช้ self กับตัวระบุ '% @' จะทำให้เกิดการเรียกซ้ำเนื่องจากจะเรียกใช้เมธอดการสั่งซื้ออีกครั้ง ตัวระบุ% p แสดงที่อยู่ของตัวชี้
Vladimir

3
ฉันมักจะ[NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- ที่อยู่จะลงเอยที่นั่นเพราะNSObjectมี แต่คุณก็ไม่ทิ้งสิ่งที่คุณตัดสินใจว่าเกี่ยวข้องกับการดีบักในคลาสระดับสูงใด ๆ ที่คุณอาจได้รับมา
Tommy

7
หมายเหตุเพิ่มเติม: %pคาดว่าจะมีตัวชี้ประเภทvoid *คุณต้องส่งselfกลับไปvoid *มีพฤติกรรมที่ไม่ได้กำหนดอื่น ๆ เกิดขึ้น

4
@ user529758: ไม่จำเป็นต้องแคสต์ไม่มีพฤติกรรมที่ไม่ได้กำหนด void *และidภายในเกือบจะเหมือนกันและในกรณีนี้ไม่มีความแตกต่างใด ๆ ที่คุณจะโยนมันไปvoid *หรือไม่
Michael

1
คุณต้องใส่สัญลักษณ์ '&' ก่อนอาร์กิวเมนต์ 'self'
Artyom Devyatov

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

ดังนั้นในกรณีของโมเดลอ็อบเจ็กต์ที่คุณมีตัวดำเนินการที่เป็นรูปธรรมซึ่งได้มาจากคลาสนี้คุณจะแสดงชื่อคลาสที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.