如何检查字符串是否是对象的实例变量?

时间:2011-09-27 17:58:49

标签: objective-c

我有一个关于对象变量的问题,我想知道我是否可以检查字符串是否是对象的实例变量? 下面,举例说明我的问题:

我有一个对象 - MyObject.h:

@interface MyObject :  NSObject  
{
    //Variables
    id myVariable1;
    id myVariable2;

}
@property (nonatomic, retain) id myVariable1;
@property (nonatomic, retain) id myVariable2;

我还有一个数组列表:

NSArray * myArray = [[NSArray alloc] initWithObjects:@"myVariable1",@"myVariable2",@"myVariable3",@"myVariable4",nil]; 

我想知道是否可以确定数组列表中的哪些字符串未在对象MyObject中定义为变量。
=>对于这种情况,myVariable3和myVariable4。

我尝试使用“isKindOfClass”,“isMemberOfClass”,“valueForKeyPath”,“valueForKey”但没有成功...如果您有解决我问题的建议,请告诉我:))

3 个答案:

答案 0 :(得分:2)

假设属性未使用自定义setter名称,您可以执行以下操作:

MyObject *object = ...;
for (NSString *name in myArray) {
  SEL getterName = NSSelectorFromString(name);
  if ([object respondsToSelector:getterName]) {
    NSLog(@"MyObject has a method named %@", getterName);
  } else {
    NSLog(@"MyObject does not have a method named %@", getterName);
  }
}

答案 1 :(得分:1)

我会使用NSClassFromString类创建一个用于比较的对象。

if ([myClass isKindOfClass:NSClassFromString(myClassString)] {
   // class matches string
} else {
   // class doesn't match
}

答案 2 :(得分:0)

检查数组中的值是否是某个对象的属性更容易。与您的情况一样,valueForKey:仅在myInstance1myInstance2为非零对象时才有效。您只需要实现- (id)valueForUndefinedKey:方法即可返回nil,一切都会好起来的。

您还可以尝试使用object_getInstanceVariable方法迭代数组并分别获取每个可能的实例变量。我相信未声明的实例应该返回NULL指针(而不是声明但未定义的nil实例)。