为啥从未执行过的 Swift 3 代码会引发运行时错误?

Posted

技术标签:

【中文标题】为啥从未执行过的 Swift 3 代码会引发运行时错误?【英文标题】:Why is Swift 3 code that's never executed throwing runtime errors?为什么从未执行过的 Swift 3 代码会引发运行时错误? 【发布时间】:2016-07-08 21:41:39 【问题描述】:

我一直在使用 Apple 的 WWDC 视频中的教程开发 iMessage 扩展程序,但遇到了一个奇怪的错误。我从一个空白项目开始,它运行得很好。但是,我为我的MSStickerBrowserViewController 添加了一个文件。代码已构建,但在模拟器中打开扩展使其崩溃。奇怪的是,我从来没有创建浏览器的实例。为什么没有执行的代码会崩溃?

这是错误:dyld:未加载库:@rpath/libswiftSwiftOnoneSupport.dylib 引用自:/Users/alextyshka/Library/Developer/CoreSimulator/Devices/BF34F16D-3CEF-4C7D-8D9A-D3D4B463F293/data/Containers/Bundle/Application/75E2E14B-E76B-4EC7-9528-7CE38864B55D/BlankMessages.app/PlugIns/ MessagesExtension.appex/MessagesExtension 原因:找不到图片 这是触发错误的代码:

import UIKit
import Messages

class MyStickerBrowserViewController: MSStickerBrowserViewController 
    var stickers = [MSSticker]()
    func changeBrowserViewBackgroundColor(color: UIColor) 
        stickerBrowserView.backgroundColor = color
    
    func loadStickers() 
        createSticker(asset: "forest", localizedDescription: "forest sticker")
    
    func createSticker(asset: String, localizedDescription: String) 
        guard let stickerPath = Bundle.main().pathForResource(asset, ofType: "png") else 
            print("couldn't create the sticker path for", asset)
            return
        
        let stickerURL = URL(fileURLWithPath: stickerPath) //This is the line that seems to be causing the error. 
        let sticker: MSSticker
        do 
            try sticker = MSSticker(contentsOfFileURL: stickerURL, localizedDescription: localizedDescription)
            stickers.append(sticker)
             catch 
                print(error)
            return
        
    
    /*
    override func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int 

    

    override func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker 

    */

我注意到,如果我取出创建 URL 的第 16 行,则不会引发错误。

Here 是我关注的 WWDC 视频的链接。我已经仔细检查以确保我完全按照视频进行了

【问题讨论】:

您可能想尝试添加异常断点以查看问题的确切位置,以便我们更好地了解错误可能是什么。 我使用了断点。错误在willBecomeActiveviewDidLoad 之前被提前抛出 this 问题中的用户在 Apple Watch 应用上遇到了同样的错误,但该解决方案对我不起作用。 在您的程序开始执行之前,动态链接器 (dyld) 查看您的程序需要的外部库并加载它们。如果不能,它将中止执行。这就是为什么仅仅引用另一个库中的代码或数据可能会导致您的程序失败。有一些工具可以让你看到你的程序需要一个库来做什么(尽管我不知道他们的调用,而且我现在不在 Mac 前);我的猜测是您的程序引用了类元数据。 谢谢。我正在使用 Apple 的 Messages 框架。没有第 3 方,所以这很奇怪。如果有帮助,我将使用有问题的代码更新我的帖子 【参考方案1】:

我重新安装了 Xcode,它工作正常。奇怪的。谢谢大家的建议!

【讨论】:

以上是关于为啥从未执行过的 Swift 3 代码会引发运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章

深入学习java虚拟机,三个你从未听过的虚拟机黑科技

当我从 C# 代码调用导入的 C++ 函数时,为啥会引发 AccessViolationException?

为啥 Swift 不支持 iO 中的静态库

为啥从针对任何 CPU 的 C# 项目调用此代码时会引发 System.AccessViolationException?

当两个版本具有相同的行为时,为啥这个 Swift 游乐场会显示不同数量的执行? [复制]

为啥安装 esparse 时“yarn install”会引发 ENOENT 错误?