Apple开发_打印一个实例对象中的属性与值,包括在父类中的

#import <objc/runtime.h>

// 打印一个实例对象中的属性与值,包括在父类中的
- (void)print_Self_Properties {
    
// DEBUG  模式下打印日志,当前行
#ifdef DEBUG
    
    unsigned int count = 0;
    Class gc_class = [self class];
    GCLog(@"统计开始 ⌛️")
    NSMutableArray *key_array = [[NSMutableArray alloc] init];
    NSMutableArray *target_array = [[NSMutableArray alloc] init];
    
    while (gc_class) {
        // 获取类的属性列表
        objc_property_t *properties = class_copyPropertyList(gc_class, &count);
        
        for (NSInteger index = 0; index < count; index++) {
            // 获取属性的名称
            objc_property_t property = properties[index];
            //const char *property_name = property_getName(property);
            NSString *property_name = [NSString stringWithCString:property_getName(property)
                                                encoding:NSUTF8StringEncoding];
            
            @try {
                // 获取属性对应的值
                id value = [self valueForKey:property_name];
                if (value) {
                    if (![key_array containsObject:property_name]) {
                        [key_array addObject:property_name];

                        NSString *key_object = NSStringFormat(@"%@ = %@", property_name, value);
                        if ([value isKindOfClass:[NSString class]]) {
                            //[target_array addObject:key_object];
                        }
                        else if ([value isKindOfClass:[@(YES) class]]) {
                            [target_array addObject:key_object];
                        }
                        else if ([value isKindOfClass:[NSNumber class]]) {
                            //[target_array addObject:key_object];
                        }
                        else if ([value isKindOfClass:[@(CGRectZero) class]]) {
                            //[target_array addObject:key_object];
                        }
                        else if ([value isKindOfClass:[@(CGSizeZero) class]]) {
                            //[target_array addObject:key_object];
                        }
                    }
                }
            }
            @catch (NSException *exception) {
                
            }
        }
        
        // 释放内存
        free(properties);
        // 将父类作为当前类继续循环
        gc_class = class_getSuperclass(gc_class);
    }
    
    if (target_array.count) {
        // 排序
        NSArray *sorted_array = [target_array sortedArrayUsingSelector:@selector(compare:)];
        for (NSInteger index = 1; index <= sorted_array.count; index++) {
            GCLog(@"键值对[%03ld]:%@", index, sorted_array[index - 1]);
        }
    }
    
    GCLog(@"统计结束 🆗")
// 发布状态
#else

#endif
}
posted @ 2023-09-07 01:04  CH520  阅读(33)  评论(0编辑  收藏  举报