【问题标题】:Xcode 4.5.1 get stuck when archivingXcode 4.5.1 存档时卡住
【发布时间】:2012-10-08 07:01:40
【问题描述】:

我刚刚将我的 xcode 升级到了 4.5.1 版。
以前一切正常,但现在,当我存档项目时,xcode 卡住/挂起并且永远无法完成存档。
在顶部的状态中,文字说:

正在编译 10 个源文件中的 10 个...

在那之后什么都没有发生。它只是卡住了。
我仍然可以编译和构建代码(无需归档),并且一切都在模拟器中运行良好。

我已经重新安装了 xcode。之后问题仍然存在。
任何建议都会被采纳。

更多信息:
我已将问题定位到特定的代码行:
CGRect tmpFrame3 = seeDetailsButton.frame;
我认为这条线没有任何问题...
为什么在模拟器中编译运行正常,存档失败???

【问题讨论】:

  • 日志窗格怎么样?这会告诉你 Xcode 在卡住时在做什么......
  • 你有旋转色轮吗?
  • 当错误发生时 - 日志窗格被卡住并且没有说明任何内容。我没有得到旋转色轮。它只是卡住了。我发现了问题所在并发布了我的答案。谢谢。

标签: ios iphone xcode ios5 ios6


【解决方案1】:

我知道这里发生了什么。
首先,它与归档过程本身无关,而与 Release 模式下的构建有关。
我在存档期间遇到问题的原因是因为它是在发布模式下构建的。

关于问题本身:
xcode 4.5.1 中似乎存在某种 Apple 编译器错误
我正在使用 Apple LLVM 编译器 4.1。在编译期间,它具有不同的优化级别。
在调试中 - 优化设置为“无”并关闭。在发行版中,它设置为“最快、最小 [-Os]”。当我在发布模式下关闭优化(将其设置为“无”)时 - 问题不会发生。

更多信息:
在挖掘了我的代码并试图找出在优化期间会导致编译器错误的原因后,我发现我有以下内容:

__weak ProfileButton *tmp = myButton;

ProfileButton 只是一个继承自 UIButton 的常规按钮。
当我删除 __weak 时,一切正常。即使我将编译器优化设置为“最快、最小 [-Os]”。

【讨论】:

  • 遗憾的是,这对我不起作用,Xcode 5.1,LLVM 5.1 代码生成器
【解决方案2】:

最近遇到了同样的问题,Xcode 在编译期间挂在最终文件上。与上述问题相同,将发布的优化级别设置为无([-O0] 以匹配调试模式)将允许存档成功运行。

但是,对于我们的代码,特定的错误与捕获自身的块相关联。每Apple's guidelines

"如果需要在一个block中捕获self,比如定义一个 回调块,考虑内存管理很重要 影响。

块保持对任何捕获对象的强引用,包括 self,这意味着很容易得到一个强引用 循环……”

因此,如果适用,请务必检查您的代码,并遵循 Apple 的最佳实践来捕获对自身的弱引用 (example in documentation)。

【讨论】:

    【解决方案3】:

    在我的例子中,我创建了一个循环子类

    好像

    @interface BaseTableViewController : PaymentTableViewController 
    

    @interface PaymentTabelViewController : BaseTableViewController
    

    我所做的是重新命名最后一个子类,所以它现在看起来像这样:

    @interface TopTableViewController : PaymentTableViewController 
    

    @interface PaymentTableViewController : BaseTableViewController 
    

    【讨论】:

      【解决方案4】:

      在我的例子中,当一个源文件包含一个非常大的数组的声明时,问题就出现了:

      NSArray<NSArray<NSNumber *> *> *points =
          @[
              @[@38.576732f, @-90.230682f, @1495320246], // 1 item
              ...
              @[@37.478034f, @-89.524851f, @1495336147] // 3000 item
          ];
      

      大约有 3k 个项目。将源代码行拆分为小代码行没有帮助。

      通过将项目放在 CSV 文件中并在运行时对其进行解析来修复它。

      另一种方法是拆分成更小的数组并在运行时连接。

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2012-09-27
        • 2013-09-24
        • 2021-11-14
        • 1970-01-01
        • 2012-05-28
        相关资源
        最近更新 更多