如何在Objective C中的对象数组中获取对象的属性?

时间:2012-01-15 05:35:41

标签: objective-c ios cocoa-touch nslog

我有一个自定义对象数组,但我不能NSLog该数组中单个对象的属性,因为您可以在数组中存储任何对象。我该怎么做呢?

2 个答案:

答案 0 :(得分:6)

Objective-C通过它运行时系统提供了几个introspection techniques

您可以询问某个对象,如果它来自某种类型,或对某条消息的回复。

for (id anObject in array ){
    if([anObject isKindOfClass:[MyClass class]]){
        MyOtherClass *obj = anObject.myProperty ;
        NSLog(@"%@", obj);
    }
}

for (id anObject in array ){
    if( [anObject respondsToSelector:@selector(aMethod)] ) {
        NSLog(@"%@",[anObject aMethod]);
    }
}

由于属性通常会产生合成方法,第二种方法也适用于它们。

另外提及 - 虽然不在本问题的范围内:

如果他们满足某个协议,也可以询问类。而且,当对象可以告诉那里的课时,这也是可能的:

[[anObject class] conformsToProtocol:@protocol(MyProtocol)];

答案 1 :(得分:2)

上述答案对于访问各个字段是正确的。正如旁注所示,当您拥有类似于数组的集合时,您还可以使用键值路径编码和集合运算符进行一些有趣的技巧。例如,如果您有一大组对象,其中一个字段的值很少:

 NSArray *allObjects;

您可以使用以下语句创建一个包含其中一个字段的所有唯一值的数组:

 NSArray *values=[allObjects valueForKeyPath:@"@distinctUnionOfObjects.myObjectsInterestingProperty"];

或者您可以使用以下语句找到字段的平均值:

 NSNumber *average=[allObjects valueForKeyPath:@"@avg.myObjectsInterestingProperty"];

Apple's Key-Value Programming Guide

中列出了您可以使用此方式使用的所有其他键值路径集合运算符