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
Tidak ada gangguan
sumber

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];
}
Vladimir
sumber
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.

Cameron Lowell Palmer
sumber