2009-04-24 50 views
0

我正在使用運行時功能來獲取屬性的類型(感謝eJames幫助我找出這種方式)。 屬性的屬性字符串看起來是這樣的:如何使用@encode()獲取@「NSArray」Objective-C

T @家「的NSArray」 &,Vstuff

我需要檢查,如果屬性類型是一個數組,此刻我做這樣的:

- (BOOL)valueForKeyIsArray:(NSString *)key fromTagret:(id)target 
{ 
    NSString *lowerCaseKey = [self convertToKVCKey:key]; 

    objc_property_t property = class_getProperty([target class], [lowerCaseKey UTF8String]); 
    NSString *propertyAttrs = [NSString stringWithUTF8String:property_getAttributes(property)]; 
    NSString *encodedType = @"@\"NSArray\""; 

    NSRange range = [propertyAttrs rangeOfString:encodedType options:NSLiteralSearch]; 
    return range.location != NSNotFound; 
} 

但由於蘋果可以隨時更改的類型定義字符串,我想產生這種@「的NSArray」字符串類型。我試過用@encode(),但它沒有工作:

NSString *encodedType = [NSString stringWithUTF8String:@encode(NSArray *)]; 

那麼我怎樣才能生成這種類型的字符串?還是有更好的方法來檢查這個屬性是否包含數組類型?

+0

沒有人有想法嗎? – Enyra 2009-04-24 14:17:33

回答

4

沒有辦法檢查這個。在Objective-C源代碼中,鍵入爲NSArray *的變量僅用於編譯器發出警告。它沒有意義,並且在運行時不存在。如果您錯誤地輸入NSArray作爲NSString,編譯時會收到很多警告,但運行時代碼的行爲完全相同。在運行時,所有已知的是,ivar /屬性是「一個對象」。

另一種想法是,一旦Objective-C被編譯,所有的對象引用都是id引用。

+0

其實你是對的,對象引用在運行時是「id」,但這對我來說並不重要。測試適用於我和我的問題是,我怎麼能生成這個@「NSArray」類型的字符串,因爲我不想對它進行硬編碼。 – Enyra 2009-06-02 08:15:24

0

只要接受,如果運行時更改,您的代碼將中斷,並繼續前進。不過,我認爲你可能會誤將NSMutableArray *CFArrayRefCFMutableArrayRef類型的ivars分類。你似乎也假設所有的鍵直接對應一個聲明的屬性。

最簡潔的解決方案可能是斷言用於測試的樣本對象(目標)必須具有該鍵的非零值,並且只抓取該值並測試[[target valueForKey:key] isKindOfClass:[NSArray class]]