获取属性列表

2019-01-02  本文已影响1人  跬步千里_LenSky

代码地址
头文件地址

/** 对象方法交换
 * aClass   要交换的类型
 * aSel     要交换的A方法
 * otherSel 要交换的B方法
 * return 是否成功
 */
+(BOOL)changeMethodWithClass:(Class)aClass andSel:(SEL)aSel andOtherSel:(SEL)otherSel;

/** 类交换方法
 * aClass   要交换的类型
 * aSel     要交换的A方法
 * otherSel 要交换的B方法
 * return 是否成功
 */
+(BOOL)metaChangeMethodWithClass:(Class)aClass andSel:(SEL)aSel andOtherSel:(SEL)otherSel;

/** 获取一个类的属性 以及类型
 * 基本数据类型 字符形式 ‘int,double,float,char,NSInteger,BOOL’
 * 其他类型都以 class 的String 类型表示
 */
+(NSArray *)getPropertyListWithClass:(Class)aClass;
+(BOOL)changeMethodWithClass:(Class)aClass andSel:(SEL)aSel andOtherSel:(SEL)otherSel
{
    if (aClass) {
        Method m1 = class_getInstanceMethod(aClass, aSel);
        Method m2 = class_getInstanceMethod(aClass, aSel);
        if (m1 && m2) {
            method_exchangeImplementations(m1, m2);
            return YES;
        }
    }
    return NO;
}

+(BOOL)metaChangeMethodWithClass:(Class)aClass andSel:(SEL)aSel andOtherSel:(SEL)otherSel
{
    Class metaClass = object_getClass(aClass);
    return [self changeMethodWithClass:metaClass andSel:aSel andOtherSel:otherSel];
}

+(NSArray *)getPropertyListWithClass:(Class)aClass
{
    NSMutableArray *propertyList = [NSMutableArray array];
    if (aClass != nil) {
        Class currentClass = aClass;
        NSString *className = [NSString stringWithFormat:@"%@",currentClass];
            while (![className isEqualToString:@"NSObject"]) {
                unsigned int count;
                objc_property_t *propertys = class_copyPropertyList(currentClass, &count);
                for (int i = 0; i< count; i++) {
                    objc_property_t p = propertys[i];
                    const char *cname = property_getAttributes(p);
                    NSString *attrs = @(property_getAttributes(p));
                    NSUInteger dotLoc = [attrs rangeOfString:@","].location;
                    NSString *code = nil;
                    NSUInteger loc = 3;
                    if (dotLoc == NSNotFound) { // 没有,
                        code = [attrs substringFromIndex:loc];
                    } else {
                        code = [attrs substringWithRange:NSMakeRange(loc, dotLoc - loc-1)];
                    }
                    const char *cName = property_getName(p);
                    // 转换为Objective C 字符串
                    NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];
                    
                    if (!code) {
                        NSString *aName = [NSString stringWithCString:cname encoding:NSUTF8StringEncoding];
                        NSArray *tNames = [aName componentsSeparatedByString:@","];
                        if (tNames&&tNames.count>0) {
                            NSString *typeName = tNames.firstObject;
                            if ([typeName isEqualToString:@"Td"]) {
                                //double
                                code = @"double";
                            }else if ([typeName isEqualToString:@"Ti"]){
                                //int
                                code = @"int";
                            }else if ([typeName isEqualToString:@"Tf"]){
                                //float
                                code = @"float";
                            }else if ([typeName isEqualToString:@"Tq"]){
                                //NSInteger
                                code = @"NSInteger";
                            }else if ([typeName isEqualToString:@"T*"]){
                                code = @"char";
                            }else if ([typeName isEqualToString:@"TB"]){
                                code = @"BOOL";
                            }else{
                                NSLog(@"未知类型输出|%@",typeName);
                            }
                        }
                    }
                    if (name&&code) {
                        NSLog(@"输出name ---- |%@",name);
                        [propertyList addObject:@{@"name":name,@"type":code}];
                    }
                }
                //重新赋值当前类型
                NSObject *obj = [[currentClass alloc]init];
                currentClass = obj.superclass;
                className = [NSString stringWithFormat:@"%@",currentClass];
                free(propertys);
            }
    }
    return propertyList;
}
上一篇 下一篇

猜你喜欢

热点阅读