2010-08-11 72 views
2

我目前正在开发iPhone应用程序 - 暂时 - 需要在4.x之前的版本上支持。支持4.0/3.2之前的iOS版本以及NSClassFromString的问题

当我想要使用的东西4.x或3.2具体的,我会用检查,如果给定类存在的通常的做法,即:

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

这主要工作,当它不除。 (根据文件仅适用于3.2或更新版本)

  • UIGestureRecognizer子

    • UIMoviePlayerViewController(如UIPanGestureRecognizer; UITapGestureRecognizer等)

    : 让我解释一下:

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

    这真的很糟糕,因为NSClassFromString()方法实际上是由Apple推荐的。

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

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

  • 回答

    0

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

    2

    不,你没有做错什么,有一些私人类在3.2/4.0中公开。如果他们只是公开现有的功能,这将不是什么大问题,但是这些类通常也具有显着改变的功能。

    要做的唯一100%可行的事情就是测试版本,尽管这通常是不被接受的。即使对特定的选择器进行测试也可能不够充分,因为不能保证旧版本的选择器与公布该对象的版本上的选择器的行为相同。

    +0

    实际上,在有私人实施的情况下,Apple建议您检查操作系统版本以确定功能。在处理重新呈现UIScrollView中的缩放视图时,检查版本也是必要的,因为它报告OS 3.2中更改的缩放因子的方式。 – 2010-08-11 19:19:07

    +0

    请参阅WWDC第130会议视频 - “未来打样您的应用程序”了解更多信息。 – 2010-08-11 19:21:21

    0

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

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

    我实际上没有遇到使用NSClassFromString()的建议。我通常使用类似[AVCaptureSession class]的东西,但您同样可以使用[[[AVCaptureSession alloc] init...] autorelease]。加载时不存在的弱链接符号变为NULL;这意味着AVCaptureSession类对象变为零,并且nil上的方法不做任何事情并返回nil。

    如果您要比较版本号,比较可靠的方法是与kCFCoreFoundationVersionNumber进行比较。我还没有看到一个4.0; kCFCoreFoundationVersionNumber_iPhoneOS_3_2看起来是4.0头文件中最高的一个。