切换到 XCode 7.0(.1) 后,自定义视图 (XIB) 在发布模式下崩溃

Posted

技术标签:

【中文标题】切换到 XCode 7.0(.1) 后,自定义视图 (XIB) 在发布模式下崩溃【英文标题】:Custom view (XIB) crash in Release mode after switching to XCode 7.0(.1) 【发布时间】:2015-09-29 11:36:18 【问题描述】:

我有一个应用程序在 XCode 7.0 GM 之前运行良好。在我使用 XCode 7.0 GM 构建它之后,它开始在启动时崩溃。它在加载我的一个自定义视图时崩溃,代码如下:

func loadViewWithName(viewName: String, owner: UIView) 
    let view = NSBundle.mainBundle().loadNibNamed(viewName, owner: owner, options: nil).first as! UIView
    view.frame = owner.bounds
    owner.addSubview(view)


class AddView2 : UIView 
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        loadView()
    

    @IBOutlet weak var pendingToAddNotification: UIView!

    private func loadView() 
        loadViewWithName("AddView2", owner: self)

        // print("asd") // if this is uncommented the app doesn't crash

        pendingToAddNotification.backgroundColor = UIColor.blackColor() // CRASH HERE, when I try to to change something in the loaded view, most probably because the outlet isn't set (it is nil), which was my assumption since it is called after view is loaded. 
    


class AddView : UIView 
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        loadView()
    

    @IBOutlet weak var pendingToAddNotification: AddView2!

    private func loadView() 
        loadViewWithName("AddView", owner: self)

        pendingToAddNotification.backgroundColor = UIColor.blackColor()
    

,其中 AddView 包含 AddView2,ViewController 包含 AddView。我有 AddView.xib 和 AddView2.xib 文件,其中文件的所有者分别设置为 AddView 和 AddView2。

我以为我做错了什么,但很奇怪为什么相同的代码在调试模式下工作,更有趣的是为什么如果我取消上面提到的 print 的注释,应用程序不会崩溃并按预期启动。

XCode 7.0(.1) 中是否有任何更改导致此类问题? 它看起来像是某种竞争条件,由print(因为它需要额外的时间来执行)或调试模式(因为它更慢)修复,但据我所知,两个视图的加载都必须完成在主线程中,还是我错了? 非常感谢任何帮助!

EDIT1:这是整个project

EDIT2:刚刚发现如果我将loadViewWithName 内容复制到loadView,它不会崩溃。

【问题讨论】:

你有崩溃日志要分享吗? 我已经添加了整个项目,因为它只有几 KB,而且会更容易 【参考方案1】:

我找到了问题的解决方案 - 制作了全局函数 UIView 扩展。我仍然不确定是什么问题以及为什么代码不能与全局函数一起使用。

【讨论】:

以上是关于切换到 XCode 7.0(.1) 后,自定义视图 (XIB) 在发布模式下崩溃的主要内容,如果未能解决你的问题,请参考以下文章

切换到 Gradle:为啥我必须防止自定义视图被混淆?

在 xcode 中的自定义视图中给出高度后刷新情节提要视图控制器

从自定义导航栏展开 segue 后,如何切换回默认导航栏外观?

在xcode中自定义视图中给出高度后刷新故事板视图控制器

使用 XCode 故事板切换视图控制器时出现黑屏

将 Xcode 更新到 7.0 后出现错误