2012-05-10 20 views
0

我在我的項目中使用KVC。KVC valueForKey返回一個__NSCFConstantString而不是一個__NSCFString

而且,在我班的一個,我寫的屬性:

@property (nonatomic, strong)    NSString   *notes; 

我想提出一個的NSString對象在該屬性:

和設定值之前,我想測試目的地的班級名稱。

a = [ newContainer valueForKey:@"notes"]; 
if(a != nil && ![ b isKindOfClass:[ a class ] ]) 

// here b is the new NSString value 

結果是xcode表示類不一樣!

(gdb) po [ b class ] 
__NSCFString 

(gdb) po [ a class ] 
__NSCFConstantString 

我讀了這不是很重要,__NSCFConstantString是NSString的私有子類。

但是,在我的情況下,我需要檢查我的對象的所有屬性,然後再更新它。

而且我不希望在我的代碼有:

// OK, classes aren't the same ... 
// ---- BUT WE MUST test it again to know if a is a NSString and b a subclass of NSString or anything else ... 

beurk!

有沒有人有同樣的問題?

非常感謝您的幫助!

回答

0

三點:

1-你應該覈對[NSString類],將公開曝光類的財產,不是針對你的類屬性的當前值。

想象一下,當您檢查值類而不是屬性類時會發生什麼情況:在將屬性設置爲NSMutableString(它是NSString的完美實例)之後,您不能再將其設置爲常規NSString(因爲NSString不是NSMutableString的子類)。您目前的問題是本段中描述的變體,可能更易於理解。

2-測試應該在擁有該屬性的類中完成,而不是像現在這樣做。因爲只有那個類有權知道它接受的對象的類型。

3-所以。使用標準的validateValue:forKey:error:方法,這是你的朋友在這裏。這個方法將由類實現,並且確保筆記是一個NSString。在類之外,您不會直接檢查值的類型,而是要求容器類對其進行驗證。

和voilà!

相關問題