【问题标题】:2 lines mean it won't run on iPad2 行意味着它不能在 iPad 上运行
【发布时间】:2010-07-21 14:30:22
【问题描述】:

我们有一个项目在 OS4 上运行良好,但在 iPad 3.2 上运行时遇到问题。

基础 SDK 为 4.0,部署目标为 3.2。

iPad 模拟器(和设备)上的代码在启动之前就崩溃了,并出现错误

"临时数据格式化程序 不可用”

如果我取出 2 条线,它似乎运行正常......

AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:options];

export = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetPassthrough];

我根据存在的操作系统进行分支,以便在 3.2 设备(我知道它们是 OS4)上永远不会到达这些行,但只是它们在那里会使事情崩溃在它开始之前。

有什么想法吗? 干杯

【问题讨论】:

    标签: iphone iphone-sdk-3.2


    【解决方案1】:

    如果在 iPad 上从未达到这些行,您可能会因为没有弱链接 AVFoundation 框架(以及可能的其他框架)而遇到问题。由于 AVURLAsset 和 AVAssetExportSession 在 3.2 中不作为符号存在,因此您的应用程序可能会在旧操作系统上启动时崩溃。

    我描述了如何弱链接框架以响应 this answer 中的 similar problem

    【讨论】:

    • 看准布拉德!马上就解决了。
    • 将部署目标指定到某个早期版本不会自动弱化该版本中不存在的链接符号?
    • @pqnet - 使用 iOS 4.2 SDK 和 iOS 3.1 及更高版本的目标,您现在可以使用每类弱链接而不是基于框架的弱链接:marco.org/2010/11/22/…。我不确定哪些 Mac 运行时和 SDK 版本也支持此功能。对于早于 3.1 的目标,您仍然需要弱链接框架。
    【解决方案2】:

    首先,“数据格式化程序暂时不可用”是一条 GDB 消息,它不是您的应用程序崩溃的原因。可以在here找到有关此消息的更多信息。

    如果您想编写在 iOS 3.0 和 4.0 上运行的代码,您需要在运行时(而不是编译时)检查类的可用性。

    您可以像这样使用NSClassFromString 函数来做到这一点:

    if (NSClassFromString(@"AVURLAsset")) {
        // 4.0 code using AVURLAsset goes here
    } else {
        // 3.0 code goes here
    }
    

    【讨论】:

      【解决方案3】:

      试试这个(或类似的):

      #if __IPHONE_OS_VERSION_MIN_REQUIRED < 40000
        // code for iOS below 4.0
      #else
        // code for iOS 4.0
      #endif
      

      this question窃取。

      【讨论】:

      • 我认为他必须上传一个二进制文件才能在 4.0 和 3.2 上运行,因此检查必须在运行时进行,而不是在编译时进行。
      • 确实 - 两者的二进制文件相同。如果在 3.2 上运行,我引用的行甚至永远不会到达,因为我已经分支了。让我感到困惑的是,它们的包含意味着二进制文件甚至不会从 3.2 开始。
      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 2021-01-03
      • 2011-08-18
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      相关资源
      最近更新 更多