有些时候使用Xcode自带的打印输出不能满足自身的需求,比如想要打印模型里的内容,每次都去重写description方法,或者打断点调试,不是那么方便,所以写了一份通过runtime将模型中的成员变量相对应的值打印出来的Category。
主要代码如下:
+ (void)load {
// 交换两个方法
method_exchangeImplementations(class_getInstanceMethod([NSObject class], @selector(description)), class_getInstanceMethod([NSObject class], @selector(customDescription)));
}
/**
* 该方法是用来自定义模型(直接继承NSObject)的输出格式
*
* @return 格式化后的字符串
*/
- (NSString *)customDescription {
Class class = [self class];
NSMutableString *descString = [NSMutableString stringWithFormat:@"%@ = {\n", [self customDescription]];
while (class != [NSObject class]) {
if ([[class description] hasPrefix:@"NS"] || [[class description] hasPrefix:@"__"] || [[class description] hasPrefix:@"AV"] || [[class description] hasPrefix:@"_UIFlowLayout"] || [[class description] hasPrefix:@"UITouchesEvent"] || [class isSubclassOfClass:[UIResponder class]] || [class isSubclassOfClass:[CALayer class]] || [class isSubclassOfClass:[UIImage class]]) return [self customDescription];
unsigned int count = 0;
Ivar *ivars = class_copyIvarList(class, &count);
for (int i = 0; i < count; i ++) {
// 根据位置获取成员变量
Ivar ivar = ivars[i];
// 获取成员变量名
const char *name = ivar_getName(ivar);
// 将获取到的成员变量转为OC字符串
NSString *ivarName = [NSString stringWithUTF8String:name];
// 根据成员变量名获取对应的值
id value = [self valueForKey:ivarName];
[descString appendFormat:@"\t%@ = %@;\n", ivarName, value];
}
// 释放指针
free(ivars);
class = class_getSuperclass(class);
}
[descString appendFormat:@"}\n"];
return descString;
}
通过交换系统自带的description与自己写的customDescription方法, 来实现对模型的输出
网友评论