使用 iOS 4.0 中的方法时,iOS 3.0 会崩溃吗?

Posted

技术标签:

【中文标题】使用 iOS 4.0 中的方法时,iOS 3.0 会崩溃吗?【英文标题】:Would iOS 3.0 crash when using methods from iOS 4.0? 【发布时间】:2011-02-17 10:13:31 【问题描述】:

我们正在构建一个处理 iPhone 通讯录的应用程序。在 4.0 版中,Apple 在地址簿中实现了源,并且还提供了一些方法(检索源、写入源等)。此功能在小于 4.0 的 ios 中不存在。

我们已经更新了我们的应用程序以适应大约 4.0 和 4.2 处理地址簿来源的方式,但我还没有在 3.0 设备上测试它。

一般来说,如果您在没有这些方法的旧版本操作系统上使用更新的 SDK 方法,应用程序会崩溃吗?

谢谢!

【问题讨论】:

【参考方案1】:

是的,它会崩溃。

要么检查应用程序运行的 iOS 版本,以确定是否使用特定功能,要么将有问题的调用放在 if ([object respondsToSelector:@selector]) 中。

如果您不想处理此问题并确保它永远不会崩溃,只需让您的应用可用于 iOS 4.0 及更高版本。

【讨论】:

【参考方案2】:

是的,它会崩溃。但是有办法防止这种情况发生。

昨天我用 Event Kit 做了类似的事情。

我创建了自己的 EventHandler 对象,如果没有 Event Kit,它会在 init 中返回 nil。对 nil 的调用是完全合法的,因此这个抽象类可以防止 iOS3 上的崩溃。而且我不需要对每次调用都进行 NSClassFromString 检查。

由于缺少 iOS3 设备,我还无法对其进行测试,但我希望它能工作。

- (id)init 
    self = [super init];
    if (self) 
        Class eventKitClass = NSClassFromString(@"EKEventStore");
        if(eventKitClass) 
            // iOS4++
            // more init
        
        else 
            // iOS3
            [self release];
            return nil;
        
    
    return self;

您必须弱链接 Event Kit 框架。 [目标/您的目标/获取信息/常规]

编辑:我误读了您的问题,您不是在询问活动套件。但该方法也适用于地址簿框架。

EDIT2:由于地址簿从 iOS 2.0 开始可用,因此我的方法对您毫无用处。 你必须使用

if ([foo respondsToSelector:@selector(doSomething:)])  
    [foo doSomething:bar]; 

对于您进行的每个呼叫,iOS3 中可能不存在。就像其他回答者所说的那样。

【讨论】:

谁赞成这个必须和我有相同的阅读理解问题^^

以上是关于使用 iOS 4.0 中的方法时,iOS 3.0 会崩溃吗?的主要内容,如果未能解决你的问题,请参考以下文章

检查 iOS 版本是不是与 PHP 兼容,从 iOS 3.0 到 IOS 4.0 或更高版本

使用 iOS 4.0 库时的向后兼容性

在 iOS 4.0 上释放 Autoreleasepool 崩溃(以及在 4.1 上......)

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

IOS:如何检测配对蓝牙 3.0 设备的品牌/型号?

Swift 3.0 Alamofire 4.0 - Domain=NSURLErrorDomain Code=-999 “取消”