美文网首页
使用runtime 将自定义模型(直接继承NSObject)的输

使用runtime 将自定义模型(直接继承NSObject)的输

作者: utchi | 来源:发表于2018-03-21 10:41 被阅读0次

有些时候使用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方法, 来实现对模型的输出

相关文章

网友评论

      本文标题:使用runtime 将自定义模型(直接继承NSObject)的输

      本文链接:https://www.haomeiwen.com/subject/btpwqftx.html