美文网首页iOS面试
oc-Runtime学习(获取类中所有属性名)

oc-Runtime学习(获取类中所有属性名)

作者: SK丿希望 | 来源:发表于2018-05-19 11:04 被阅读8次

类声明

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Person : NSObject{
    NSString *_variableString;
}
// 默认会是什么呢?
@property (nonatomic, copy) NSString *name;

// 默认是strong类型
@property (nonatomic, strong) NSMutableArray *array;

// 获取所有的属性名
- (NSArray *)allProperties;
@end

类实现

#import "Person.h"

/// 表示Objective-C声明属性的不透明类型。
typedef struct objc_property *objc_property_t;
@implementation Person
// 获取类的所有属性
- (NSArray *)allProperties {
    unsigned int count;
    // 如果没有属性,则count为0,properties为nil
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
    for (NSUInteger i = 0; i < count; i++) {
        // 获取属性名称
        const char *propertyName = property_getName(properties[i]);
        NSString *name = [NSString stringWithUTF8String:propertyName];
        [propertiesArray addObject:name];
    }
    // 注意,这里properties是一个数组指针,是C的语法,
    // 我们需要使用free函数来释放内存,否则会造成内存泄露
    free(properties);
    return propertiesArray;
}
@end

外部使用

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *p = [[Person alloc] init];
    p.name = @"Lili";
    size_t size = class_getInstanceSize(p.class);
    NSLog(@"size=%ld", size);
    for (NSString *propertyName in p.allProperties) {
        NSLog(@"%@", propertyName);
    }
}

运行结果

image.png

相关文章

  • oc-Runtime学习(获取类中所有属性名)

    类声明 类实现 外部使用 运行结果

  • ruanTime使用

    获取类中的方法进行交换 通过字符串获取类名 获取属性的名称和类型

  • 看MJExtension源码之获取所有的属性

    思路 利用runtime获取所有的属性 注意点 为了保证获取到所有的属性,不仅要获取当前类的所有属性,还要获取其父...

  • Swift-Runtime学习(获取类中所有属性名)

    扩展NSObject 使用(注意:要获取的类前必须添加@objcMembers 不然获取是空数组) 1.定义模型 ...

  • Runtime 那些事儿 二

    1. 获取一个类的所有方法 2. 获取一个类的所有属性 3. 获取/设置类的属性变量 4. 判断类的某个属性的类型...

  • runtime基本用法

    1 当我们动态加载某个类的时候,可以用到runtime,可以便捷的获取到动态加载类的所有信息 (属性,属性名)

  • day13面向对象

    内置类属性 类.name :获取类的名字类.doc :获取类的说明文档类.dict :获取类中所有的类属性对应的值...

  • 3. 再谈spring IoC

    IoC实现原理 反射 : 在运行状态中,根据提供的类的路径或者类名,通过反射来动态的获取该类的所有属性和方法。 工...

  • 25、反射(一)

    上面学习了Class类,反射主要是用来获取到类的属性和方法。 几点说明: 另外一种获取class的方法: 类名.c...

  • 2019 面试前的准备 -- runtime

    runtime 笔记 获取类的所有属性和变量 class_copyIvarList 输出结果: 获取所有属性 cl...

网友评论

    本文标题:oc-Runtime学习(获取类中所有属性名)

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