2011-09-27 50 views
1

我有一個關於對象的變量的問題,我想知道如果我可以檢查一個字符串是否是一個對象的實例變量? 下面一個例子來說明我的問題:如何檢查一個字符串是否是一個對象的實例變量?

我有一個對象 - 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」,但沒有成功...讓我知道,如果你有一些建議,以解決我的問題:)

+0

這與實例無關!我的第一個編輯是錯誤的,我用「方法」,這是問如果「如何檢查對象是否有特定的*屬性*」 - *不是「實例」*,因爲這只是給定屬性的名稱(或方法,哎呀,對我來說,手指太快)。請相應更新。 – 2011-09-27 18:09:38

+0

你可能是指「實例變量」而不是「實例名稱」? – AliSoftware

+0

您可能想編輯原始帖子,以更好地反映它的真正含義。 – jlehr

回答

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); 
    } 
} 
+0

這是一個不錯的解決方案。儘管這隻適用於暴露的ivars。 – Eimantas

+0

@Eimantas你是什麼意思?這是檢查是否存在方法,而不是ivar,並且無論方法是否在私有類別中聲明,都將工作。沒有任何東西是安全的...;) –

+2

OP詢問實例變量。如果我聲明瞭實例變量,但不通過'@ property'語句或自定義getter暴露它 - 我將無法使用此方法在對象之外「檢測」它。 – Eimantas

1

我會創造一個使用NSClassFromString類進行比較的對象。

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

它更容易檢查數組中的值是某些對象的屬性。在你的情況下,valueForKey:只有在myInstance1myInstance2是非零對象的情況下才能工作。您只需要執行- (id)valueForUndefinedKey:方法即可返回nil,並且所有內容都可以很好用。

您也可以嘗試使用object_getInstanceVariable方法,同時遍歷數組並分別獲取每個可能的實例變量。我相信未聲明的實例應返回NULL指針(而不是nil已聲明但未定義的實例)。

相關問題