切换到 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) 在发布模式下崩溃的主要内容,如果未能解决你的问题,请参考以下文章
在 xcode 中的自定义视图中给出高度后刷新情节提要视图控制器