2010-10-18 33 views
0

我總是想知道,在我們的代碼中使用任何內置的類之前,我們是否應該使用NSClassFromString是通用的。或者是否有任何標準的做法來使用它。同樣的財產。我們應該分別使用valueForKey和setValue調用來訪問任何屬性。這是一種標準做法嗎?在我們的代碼中使用任何類之前,我們應該使用NSClassFromString嗎?

例如看看下面的代碼

// Screen scaling 
    if ([self respondsToSelector:@selector(setContentsScale:)]) 
    { 
    Class screenClass = NSClassFromString(@"UIScreen"); 
    if (screenClass != Nil) 
    { 
    id scale = [[screenClass mainScreen] valueForKey:@"scale"]; 
    [(id)self setValue:scale forKey:@"contentsScale"]; 
    } 
    } 

這裏的一切檢查後再行使用。是否需要這樣做以及性能如何?

回答

3

不,這隻適用於你不知道它們是否存在於你的環境中的類,或者是在運行時動態加載的類(iOS不允許但是可以在Mac OS X上使用,不需要關心)。

您需要執行此操作,例如如果你想支持3.0設備,但是使用4.x類(如果可用),比如GameKit類。由於UIScreen自2.0起可用,因此您無需在此處使用NSClassFromString。但是,您需要檢查scale的存在,因爲它已添加到4.0中,並且valueForKey:@"scale"將在4.0之前的設備上生成NSUndefinedKeyException

相反鍵 - 值編碼的,你也可以這樣做:

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    CGFloat scale = [[UIScreen mainScreen] scale]; 
    // or scale = [UIScreen mainScreen].scale; 
    // Now do something with the scale. 
} 
+0

謝謝..得到了一些澄清這一點。 – Avinash 2010-10-18 08:50:03

+0

@Avinash:如果這個答案解決了你的問題,請[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。謝謝。 – DarkDust 2011-08-30 08:23:25

相關問題