我一直想知道,在我们的代码中使用任何内置类之前我们是否应该使用NSClassFromString来制作通用的。或者是否有任何标准做法使用它。财产也一样。我们应该分别使用valueForKey和setValue调用来访问任何属性。这是一种标准做法吗?
例如,请查看以下代码
// 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"];
}
}
这里使用前检查所有内容。是否需要这样做以及性能如何?
答案 0 :(得分: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.
}