美文网首页算法或者代码RuntimeiOS开发
利用runtime获取对象的所有属性(值),所有方法

利用runtime获取对象的所有属性(值),所有方法

作者: CocoaJason | 来源:发表于2017-04-06 16:00 被阅读535次

    首先奉上demo的地址
    https://github.com/MyHZ/HZCoding.git
    还有 pod 'NSObject+HZCoding'

    接下来直接上代码了

    新建一个类别
    NSObject+HZCoding

    然后声明和实现如下方法

    1.获取对象的所有属性

    /* 获取对象的所有属性 */
    -(NSArray *)getAllProperties
    {
        u_int count;
        // 传递count的地址过去 &count
        objc_property_t *properties  =class_copyPropertyList([self class], &count);
        //arrayWithCapacity的效率稍微高那么一丢丢
        NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
        
        for (int i = 0; i < count ; i++)
        {
            //此刻得到的propertyName为c语言的字符串
            const char* propertyName =property_getName(properties[i]);
            //此步骤把c语言的字符串转换为OC的NSString
            [propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
        }
        //class_copyPropertyList底层为C语言,所以我们一定要记得释放properties
        // You must free the array with free().
        free(properties);
        
        return propertiesArray;
    }
    
    1. 获取对象的所有方法
    /* 获取对象的所有方法 */
    -(NSArray *)getAllMethods
    {
        unsigned int methodCount =0;
        Method* methodList = class_copyMethodList([self class],&methodCount);
        NSMutableArray *methodsArray = [NSMutableArray arrayWithCapacity:methodCount];
        
        for(int i=0;i<methodCount;i++)
        {
            Method temp = methodList[i];
            const char* name_s =sel_getName(method_getName(temp));
            int arguments = method_getNumberOfArguments(temp);
            const char* encoding =method_getTypeEncoding(temp);
            NSLog(@"方法名:%@,参数个数:%d,编码方式:%@",[NSString stringWithUTF8String:name_s],
                  arguments,
                  [NSString stringWithUTF8String:encoding]);
            [methodsArray addObject:[NSString stringWithUTF8String:name_s]];
        }
        free(methodList);
        return methodsArray;
    }
    

    3.获取对象的所有属性和属性内容

    /* 获取对象的所有属性和属性内容 */
    -(NSDictionary *)getAllPropertiesAndVaules
    {
        NSMutableDictionary *propsDic = [NSMutableDictionary dictionary];
        unsigned int outCount;
        objc_property_t *properties =class_copyPropertyList([self class], &outCount);
        for ( int i = 0; i<outCount; i++)
        {
            objc_property_t property = properties[i];
            const char* char_f =property_getName(property);
            NSString *propertyName = [NSString stringWithUTF8String:char_f];
            id propertyValue = [self valueForKey:(NSString *)propertyName];
            if (propertyValue) {
                [propsDic setObject:propertyValue forKey:propertyName];
            }
        }
        free(properties);
        return propsDic;
    }
    

    打个广告
    一句话 利用runtime轻松实现 归档解档:http://www.jianshu.com/p/14d0190a83d5

    相关文章

      网友评论

        本文标题:利用runtime获取对象的所有属性(值),所有方法

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