支持4.0 / 3.2之前的iOS版本以及NSClassFromString的问题

时间:2010-08-11 16:24:42

标签: iphone

我目前正在开发iPhone应用程序 - 暂时 - 需要在4.x之前的版本上得到支持。

当我想使用特定的4.x或3.2时,我会使用通常的方法来检查给定的类是否存在,即:

if(NSClassFromString(@"SomeClass")) {
  // do stuff here
}

这种情况大多有效,除非事实并非如此。 让我解释一下:

类如:

  • UIMoviePlayerViewController(根据文档仅适用于3.2+)
  • UIGestureRecognizer子类(如UIPanGestureRecognizer; UITapGestureRecognizer等)

实际上解析为有效的类,就好像它们已经在早期版本的私有API上可用。 是这样的,还是我错过了什么?

这非常糟糕,因为Apple实际上推荐使用NSClassFromString()方法。

为了安全起见,我目前正在检查操作系统版本,而不是对类存在进行运行时检查。

其他人有这个问题吗? 感谢。

3 个答案:

答案 0 :(得分:2)

不,你没有做错任何事,有许多私人课程在3.2 / 4.0中被公开。如果他们只是暴露现有的功能,这将不是什么大问题,但通常这些类也会有明显改变的功能。

唯一可行的100%是测试版本,即使这通常不赞成。即使对特定选择器进行测试也可能是不够的,因为无法保证旧版本上的选择器与公共对象的版本上的选择器的行为相同。

答案 1 :(得分:0)

检查操作系统版本甚至比使用NSClassFromString(...)更好,因为在4.0 / 3.2之前的版本中已存在某些类(如您所述)。你可以这样使用:)

答案 2 :(得分:0)

对于MPMoviePlayerViewController,我使用[MPMoviePlayerController instancesRespondToSelector:@selector(view)]。它们是同时添加的,是同一框架的一部分。

有时Apple会记录这一点;例如对于UINib我认为你应该检查[UINib respondsToSelector:@selector(nibWithNibName:bundle:)]。我不记得我在哪里读到这个。

我实际上没有遇到过使用NSClassFromString()的建议。我通常使用类似[AVCaptureSession class]的内容,但您也可以使用[[[AVCaptureSession alloc] init...] autorelease]。不存在的弱链接符号在加载时变为NULL;这意味着AVCaptureSession类对象变为Nil,而nil上的方法什么也不做,返回nil。

如果您要比较版本号,更可靠的方法是与kCFCoreFoundationVersionNumber进行比较。我还没有看到4.0的版本; kCFCoreFoundationVersionNumber_iPhoneOS_3_2似乎是4.0标题中最高的一个。