簡述description
description方法是NSObject類的一個實例方法,因此所有的Object-C對象都有description方法桅狠。description方法返回的永遠是字符串讼载。
NSLog(@"%@", self);
重寫runTime的方法來截取調(diào)用上述代碼時到底走了哪個方法
+ (BOOL)resolveInstanceMethod:(SEL)sel{
return YES;
}
//截取的方法:發(fā)現(xiàn)截取的方法是descriptionWithLocale而不是description,個人猜測是在運行時給轉(zhuǎn)成了descriptionWithLocale:中跌,而我們能夠拿到的只有description方法咨堤。
sel = "descriptionWithLocale:"
//打印結(jié)果
<ViewController: 0x7fbae8c07830>
而我們在實際使用中對于對象的內(nèi)存地址并不感冒,如果一個對象有多個屬性并且我們想打印這些屬性漩符,例如self具有name一喘、sex、birth等屬性嗜暴,我們需要這么做:
NSLog(@"obj == %@ name == %@ sex == %@ birth == %@", self, self.name, self.sex, self.birth);
我們也可以通過重寫description方法來實現(xiàn),這樣的話只要我們對這個對象進行打印就會打印出這個對象的類以及屬性
- (NSString *)description{
return [NSString stringWithFormat:@"obj == %@ name == %@ sex == %@ birth == %@", self, self.name, self.sex, self.birth];
}
description陷阱:
1.千萬不要在description方法中同時使用%@和self,下面的寫法是錯誤的
- (NSString *)description {
return [NSString stringWithFormat:@"%@", self];
}
2.同時使用了%@和self,代表要調(diào)用self的description方法,因此最終會導(dǎo)致程序陷入死循環(huán),循 環(huán)調(diào)用description方法
PS:過多的打印日志津滞,你又不想刪除,也不想造成安全問題灼伤,建議添加一個DEBUG模式:
#ifdef DEBUG
#define LYLog(...) NSLog(__VA_ARGS__)
#else
#define LYLog(...)
#endif
//平常的時候使用LYLog而不再使用NSLog
等上線的時候關(guān)閉了DEBUG模式就不會有打印了触徐。。狐赡。