NSLog alamat memori objek dalam metode deskripsi yang diganti


116

Saya mengganti metode deskripsi objek. Saya perlu tahu cara mencetak alamat memori objek untuk mengganti {???} dalam kode di bawah ini:

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

Saya ingin mencetaknya di konsol seperti ini:

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

Jawaban:


212

Untuk mencetak alamat, gunakan %ppenentu format dan penunjuk sendiri:

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

6
menggunakan self dengan penentu '% @' memang akan menyebabkan rekursi karena itu akan membuat pemanggilan metode -deskripsi lagi. % p specifier hanya menampilkan alamat pointer
Vladimir

3
Saya cenderung [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- alamatnya berakhir di sana karena NSObjectmemilikinya, tetapi Anda juga tidak membuang apa pun yang Anda putuskan relevan dengan debugging di superclass apa pun yang mungkin Anda warisi.
Tommy

7
Catatan tambahan: %pmengharapkan penunjuk tipe void *, Anda harus melemparkan selfkembali ke void *, jika tidak perilaku tidak terdefinisi terjadi.

4
@ user529758: tidak perlu melakukan transmisi, tidak ada perilaku yang tidak ditentukan. void *dan idsecara internal hampir sama, dan dalam hal ini tidak ada perbedaan apakah Anda memasukkannya void *atau tidak.
Michael

1
Anda harus meletakkan simbol '&' sebelum argumen 'diri'
Artyom Devyatov

6

Metode termudah adalah dengan menggunakan deskripsi super

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

Jadi dalam kasus objek model ini yang merupakan subkelas NSObject, Anda dapat menghindari pekerjaan ekstra dan mengingat %p.

Secara manual menggunakan NSStringWithClass () dan% p

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

Jadi dalam kasus model objek di mana Anda memiliki pelaksana konkret yang diturunkan dari kelas ini, Anda akan menunjukkan nama kelas yang benar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.