NS: Bir nesnenin bellek adresini geçersiz kılınan açıklama yönteminde günlüğe kaydedin


116

Bir nesnenin açıklama yöntemini geçersiz kılıyorum. Aşağıdaki kodda {???} ile değiştirmek için nesnenin bellek adresini nasıl yazdıracağımı bilmem gerekiyor :

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

Konsolda şu şekilde yazdırılmasını istiyorum:

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

Yanıtlar:


212

Adresi yazdırmak için %pformat belirleyiciyi ve kendinden işaretçiyi kullanın:

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

6
self'i '% @' belirteci ile kullanmak gerçekten özyinelemeye neden olur çünkü bu, -description yöntemini yeniden çağırır. % p belirteci sadece çıkışlar işaretçi adresi
Vladimir

3
Eğilimliyim [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];- adres orada olduğu için biter NSObject, ancak miras aldığınız herhangi bir üst sınıfta hata ayıklama ile ilgili olduğuna karar verdiğiniz hiçbir şeyi de atmazsınız.
Tommy

7
Ek not: %pbir tür işaretçi bekler void *, selfgeri void *çevirmeniz gerekir , aksi takdirde tanımsız davranış oluşur.

4
@ user529758: yayınlamaya gerek yok, tanımsız davranış yok. void *ve iddahili olarak hemen hemen aynıdır ve bu durumda, onu atıp atmamanızda hiçbir fark yoktur void *.
Michael

1
'Öz' argümanının önüne '&' simgesi
koymalısınız

6

En kolay yöntem süper açıklamayı kullanmaktır

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

Dolayısıyla, NSObject'in bir alt sınıfı olan bu model nesnesi durumunda, fazladan çalışma ve hatırlamadan kaçınabilirsiniz %p.

NSStringWithClass () ve% p kullanarak manuel olarak

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

Dolayısıyla, bu sınıftan türetilmiş somut bir uygulayıcınızın olduğu bir nesne modeli durumunda, doğru sınıf adını göstereceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.