Objective-C:如何获取`objc_property_t`属性的值?

时间:2011-07-22 01:06:13

标签: iphone objective-c ipad

我使用以下代码迭代对象的所有属性。我已成功检索property name char,但我不知道如何获取property value id类型的objc_property_t *allProperties = class_copyPropertyList([currentObject class], &allPropertyCount); for (unsigned int i = 0; i < allPropertyCount; i++) { objc_property_t property = allProperties[i]; const char * propertyName = property_getName(property); } 。关于如何实现这一目标的任何想法?

Person

=============================================== =========================================

编辑:谢谢大家的好评和答案。有些人问我为什么需要这个。嗯,原因如下:

我有几个同一类的对象。假设该类为mary.age = [NSNumber numberWithInt:20]; john.age = [NSNumber numberWithInt:45]; david.age = [NSNumber numberWithInt:20]; mary.gender = @"female"; john.gender = @"male"; david.gender = @"male"; ,其实例为Mary,John和David。每个对象的属性设置如下:

[self groupBaseDataObjects:self.persons withPropertyName:"age"];

我的目的是找到一种泛型方法,根据给定的属性名称Eg对对象进行分组。这将创建2组[david and mary]和[john]:

[self groupBaseDataObjects:self.persons withPropertyName:"gender"]; 

和此:

{{1}}

还会创建2组[john and david]和[mary]

2 个答案:

答案 0 :(得分:5)

好的 - 似乎没有必要做任何时髦的运动员体操来解决你的问题(不要误会我的意思 - 时髦的体操运动会很有趣......但这可能只是浪费时间这里)。

重述问题:

  

您有一个具有该类的许多实例的类(MyClass)。班级   提供了几个具有许多类的实例的属性   该属性的不同值。你有一个集合   实例,您希望轻松获取多个子集的集合   其中每个子集中的对象具有相同的特定值   属性。

为此,我只是循环原始问题并执行类似的操作(此代码从未见过编译器;它可能无法编译):

// implement this on MyClass
+ (NSDictionary*)subdivideArrayOfMyClass:(NSArray*) aCollection byAttribute:(NSString*) anAttribute
{
    NSMutableDictionary *collector = [NSMutableDictionary dictionary];
    for (MyClass *anObject in aCollection) {
        id value = [anObject valueForKey: anAttribute];
        // you'd have to special case for nil here if you wanted.
        NSMutableArray *sameValueCollector = [collector objectForKey: value];
        if (!sameValueCollector) {
             sameValueCollector = [NSMutableArray array];
             [collector setObject: sameValueCollector forKey:value];
        }

        [sameValueCollector addObject:anObject];
    }
    return collector; // no need to turn it into an immutable dict
}

这确实假设所有值都可以安全地用作字典中的键。对于你给出的例子,情况确实如此。

如果您需要具有单个值的所有对象,则可以在数组上执行valueForKey :.如果你愿意,你可以做一些时髦的设置算法来细分对象。但是,这可能会在集合上产生多次传递,而上面的工作只需要一次传递(尽管收集器中可能存在大量的哈希查找)。直截了当,直到性能分析表明它太慢。

答案 1 :(得分:3)

使用valueForKey:

id object = [customObject valueForKey:[NSString stringWithUTF8String:propertyName]];

您可以使用isEqual:进行比较。您将在适当的时候获得NSNumberNSValue。阅读KVC指南了解更多信息。

早期答案

<击> 由于getter方法将匹配属性名称,因此您可以生成属性名称的选择器并在对象上调用performSelector

[customObject performSelector:NSSelectorFromString([NSString stringWithUTF8String:propertyName])];

<击>