Objective_C动态获取实例属性

本文主要围绕一个主题,如何动态获取实例属性的值?

objective_c动行时库已经有这样的功能。使用这些方法需要加头文件

#import <objc/message.h>

要用到的方法是

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)  

从方法的名字可以看出作用:将一个类的属性copy出来。下面看一个例子,就知道如何使用了。

@interface People : NSObject {  
@property NSString *name;  
@end 

现在我们动态获取它的属性名,与实例属性值。

    People *people = [[People alloc] init];
    id peopleClass = objc_getClass("People");
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList(peopleClass, &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        NSString *propName = [NSString stringWithUTF8String:property_getName(property)];
        id value = [people  valueForKey:propName];
        fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
    }

是不是很酷呀,这样一来就可以获取所有的属性值。比如格式化对像为json或xml的时候就很有用。

但是如果类从其它的类继承过来的,父类的属性将不会被copy出来。如

@interface People : NSObject {
@property NSString *name;
@end
    
@interface Lender : People {
@property int employers;
@end
    
Lender *leader = [[People alloc] init];
id leaderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(leaderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    NSString *propName = [NSString stringWithUTF8String:property_getName(property)];
    id value = [leader  valueForKey:propName];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

这儿可能获取employers的属性的值, 如何才能获取到父类的属性呢。

有两种方法。

1:用前面提到的方法分别获取子类与父类的属性列表。

2:声明一个Protocol, Protocol中有属性,然后获取Protocol中属性列表

第二个方法中要用到两个方法:

objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
Protocol *objc_getProtocol(const char *name)

用法与前面掉到的都差不多,在此我就不多说了。







  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Objective-C 中,您可以使用运行时(Runtime)库来获取更准确的符号信息。Objective-C 运行时库提供了一些函数和数据结构,用于查询、方法、属性等的信息。 下面是一些常用的运行时函数和数据结构,可以帮助您获取更准确的符号信息: 1. `class_getName` 函数:用于获取的名称。可以使用 `class_getName([YourClass class])` 来获取 `YourClass` 的名称。 2. `class_copyMethodList` 函数:用于获取的方法列表。可以使用 `class_copyMethodList([YourClass class], &count)` 来获取 `YourClass` 的方法列表,并通过遍历列表来获取每个方法的名称和实现。 3. `class_copyPropertyList` 函数:用于获取属性列表。可以使用 `class_copyPropertyList([YourClass class], &count)` 来获取 `YourClass` 属性列表,并通过遍历列表来获取每个属性的名称和特性。 4. `sel_getName` 函数:用于获取选择器(Selector)的名称。可以使用 `sel_getName(@selector(yourMethod:))` 来获取名为 `yourMethod:` 的方法选择器的名称。 5. `ivar_getName` 函数:用于获取实例变量(Instance Variable)的名称。可以使用 `ivar_getName(yourIvar)` 来获取实例变量 `yourIvar` 的名称。 这些函数可以帮助您在运行时动态获取、方法、属性等的符号信息。您可以使用这些信息来进行调试、反射或其他需要获取符号信息的操作。请注意,运行时库的使用可能需要一定的了解,且某些操作可能需要在 Objective-C 的运行时环境中进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值