简述description
description方法是NSObject类的一个实例方法,因此所有的Object-C对象都有description方法。description方法返回的永远是字符串。
NSLog(@"%@", self);
重写runTime的方法来截取调用上述代码时到底走了哪个方法
+ (BOOL)resolveInstanceMethod:(SEL)sel{
return YES;
}
//截取的方法:发现截取的方法是descriptionWithLocale而不是description,个人猜测是在运行时给转成了descriptionWithLocale:,而我们能够拿到的只有description方法。
sel = "descriptionWithLocale:"
//打印结果
<ViewController: 0x7fbae8c07830>
而我们在实际使用中对于对象的内存地址并不感冒,如果一个对象有多个属性并且我们想打印这些属性,例如self具有name、sex、birth等属性,我们需要这么做:
NSLog(@"obj == %@ name == %@ sex == %@ birth == %@", self, self.name, self.sex, self.birth);
我们也可以通过重写description方法来实现,这样的话只要我们对这个对象进行打印就会打印出这个对象的类以及属性
- (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,代表要调用self的description方法,因此最终会导致程序陷入死循环,循 环调用description方法
PS:过多的打印日志,你又不想删除,也不想造成安全问题,建议添加一个DEBUG模式:
#ifdef DEBUG
#define LYLog(...) NSLog(__VA_ARGS__)
#else
#define LYLog(...)
#endif
//平常的时候使用LYLog而不再使用NSLog
等上线的时候关闭了DEBUG模式就不会有打印了。。。