在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c
里使用NSLog("%@",model)
这行代码打印出来的却是model
的地址. 不是我们所想要的结果~!
有没有办法解决这个问题尼,答案那就是有~!只需要重写- (NSString *)description
方法即可。如下代码:
- (NSString *)description { return [NSString stringWithFormat:@"text:%@ index:%ld ",self.text,self.index]; }
这时候在使用NSLog("%@",model)
这行代码就能打印我们想要的结果了。
那么问题继续来了…
如果model里有N
多个属性尼, 可能10
个, 可能20
个… 难道要在description
方法里一个一个写属性并拼接返回? 你不嫌麻烦, 我光看着都蛋疼了… 所以我们可以采用runtime
技术来动态获取属性并返回. 如下修改后的.m文件代码:
- (NSString *)description { //初始化一个字典 NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到当前class的所有属性 uint count; objc_property_t *properties = class_copyPropertyList([self class], &count); //循环并用KVC得到每个属性的值 for (int i = 0; i<count; i++) { objc_property_t property = properties[i]; NSString *name = @(property_getName(property)); id value = [self valueForKey:name]?:@"nil";//默认值为nil字符串 [dictionary setObject:value forKey:name];//装载到字典里 } //释放 free(properties); //return return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary]; }
现在问题继续来了..
在项目中NSLog
语句往往也很多. 如果重写description
方法. 在控制台则会打印出很多属性. 看着就不舒服~~而且还有一个问题就是, 有时候我们其实并不需要打印model
的属性.. 那这样重写description
方法反而适得其反
了! 所有, 现在有一个解决方案就是重写debugDescription
方法
什么是debugDescription
? 其实debugDescription
和description
是一样的效果. 只不过唯一的区别就是debugDescription
是在Xcode
控制台里使用po
命令的时候调用的~!
而debugDescription
的实现其实也就是调用了description
方法而已
so, 在开发过程中并且model
调试的时候, 推荐重写debugDescription
方法而不是重写description
方法. 当需要打印model
的属性的时候, 在控制台里使用po
命令即可. 如下在此修改后的.m文件
// 重写debugDescription, 而不是description - (NSString *)debugDescription { //声明一个字典 NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到当前class的所有属性 uint count; objc_property_t *properties = class_copyPropertyList([self class], &count); //循环并用KVC得到每个属性的值 for (int i = 0; i<count; i++) { objc_property_t property = properties[i]; NSString *name = @(property_getName(property)); id value = [self valueForKey:name]?:@"nil";//默认值为nil字符串 [dictionary setObject:value forKey:name];//装载到字典里 } //释放 free(properties); //return return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary]; }
这就达到了我们想要的效果, 如果需要打印model
的属性, 打个断点然后使用po
命令即可