2010-10-18 39 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

相关问题