美文网首页
获取属性列表

获取属性列表

作者: 跬步千里_LenSky | 来源:发表于2019-01-02 20:11 被阅读1次

代码地址
头文件地址

/** 对象方法交换
 * 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;
}

相关文章

  • eyoucms attribute 栏目属性列表

    attribute 栏目属性列表 [基础用法] 名称:attribute 功能:获取栏目的属性列表,或者单独获取某...

  • ios中runtime 笔记

    常见方法 1.获取属性列表 2.获取方法列表 3,获取成员变量列表 4,获取协议列表 5,获得类方法

  • 获取属性列表

    代码地址头文件地址

  • RunTime 相关函数使用

    方法交换,一般在分类的load方法使用 获取方法列表 获取实例变量列表 获取实例属性列表 获取协议列表 为类别添加...

  • iOS获取某类的属性/方法/成员变量/协议列表

    需要用到: 在这里我们随便找一个控制器 //获取属性列表 //获取方法列表 //获取成员变量列表 //获取协议列表...

  • d3之操作元素

    selection.(api)列表 1.selection.attr() 设置或者获取属性。获取属性--selec...

  • Runtime使用总结

    本文主要内容有:获取属性/方法/协议/成员变量列表、动态关联属性、动态添加方法、方法交换。 一、获取列表 使用Ru...

  • Swift获取属性列表和ivar列表

    swift 也可以通过运行时获取类的属性列表和 ivar 列表 新建一个model 类 并且添加属性 下面是获取 ...

  • Swift 获取属性列表

    通过以下方式调用可以获取Swift某一个类中的所有属性列表, 包括系统的类以及自定义的类 1, 我们可以通过获取属...

  • 关于类对象和类方法 实例方法的runtime理解

    1.通过runtime 可以获取方法列表和属性(其中方法列表可以是实例方法列表也可以是类方法列表) 1.获取方法列...

网友评论

      本文标题:获取属性列表

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