如何获得Objective-C中给定对象属性的列表(以NSArrayNSDictionary的形式)?

想象一下下面的场景:我定义了一个父类,它只扩展了NSObject,它包含一个NSString、一个BOOL和一个NSData对象作为属性.然后我有几个类扩展了这个父类,每个类都添加了很多不同的属性.

我有没有办法在parent类上实现一个实例方法,它遍历整个对象并返回,比如说,每个(子)类的NSArray个属性作为NSStrings,在父类上是not,这样我以后就可以将这些NSString用于KVC?

推荐答案

我只是自己设法得到了答案.通过使用Obj-C运行时库,我可以以我想要的方式访问这些属性:

- (void)myMethod {
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for(i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *propName = property_getName(property);
        if(propName) {
            const char *propType = getPropertyType(property);
            NSString *propertyName = [NSString stringWithCString:propName
                                                                encoding:[NSString defaultCStringEncoding]];
            NSString *propertyType = [NSString stringWithCString:propType
                                                                encoding:[NSString defaultCStringEncoding]];
            ...
        }
    }
    free(properties);
}

这需要我制作一个"getPropertyType"C函数,它主要取自一个Apple代码示例(现在不记得确切的源代码):

static const char *getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T') {
            if (strlen(attribute) <= 4) {
                break;
            }
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "@";
}

Objective-c相关问答推荐

来自 NSDate 的日期名称?

Xcode 的任何 ReSharper 类似功能?

tableView:canEditRowAtIndexPath: 弹出 viewController 时崩溃

如何向 UILabel 添加滚动功能

iOS 应用程序下一个键不会转到下一个文本字段

go 掉 UISearchBar 下的 1px 边框

当我从导航控制器推送时如何隐藏导航栏?

如何判断 Cocoa 和 Objective-C 中是否存在文件夹?

dispatch_get_global_queue vs dispatch_get_main_queue

iOS 内存分配 - 一个应用程序可以使用多少内存?

iOS 7 - 键盘动画

自定义 UISwitch 和 App Store 批准

嵌入自定义容器视图控制器时,内容位于导航栏下方.

Objective-C 中的 NSString indexOf

为什么我们不能在当前队列上使用 dispatch_sync?

如何阻止 NSNotification 中的观察者调用两次?

如何定义 UIColor 的常量值?

Objective-C:如何向 NSURL 添加查询参数?

如何使用图像和标签制作自定义 UIBarButtonItem?

如何将按钮放在不会在 iOS 中随表格滚动的 UITableView 上