线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0) 错误

Posted

技术标签:

【中文标题】线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0) 错误【英文标题】:Thread 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0) error 【发布时间】:2016-08-15 14:04:26 【问题描述】:

我得到了错误:

1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0)

我是编码新手,我正在关注这个视频https://www.youtube.com/watch?v=Fv-A8lKn7VY

代码如下:

import UIKit
import CoreData

class SwiftCoreDataHelper: NSObject 

    class func directoryForDatabaseFilename()->NSString
        return NSHomeDirectory().stringByAppendingString("/Library/Private Documents")
    

    class func databaseFilename()->NSString
        return "database.sqlite";
    

    class func managedObjectContext()->NSManagedObjectContext


        do  try NSFileManager.defaultManager().createDirectoryAtPath(SwiftCoreDataHelper.directoryForDatabaseFilename() as String, withIntermediateDirectories: true, attributes: nil) 
        catch 
            print("Error Creating Directory for DB")
        
        //        NSFileManager.defaultManager().createDirectoryAtPath(SwiftCoreDataHelper.directoryForDatabaseFilename(), withIntermediateDirectories: true, attributes: nil, error: &error)

        let path:NSString = "\(SwiftCoreDataHelper.directoryForDatabaseFilename()) + \(SwiftCoreDataHelper.databaseFilename())"

        let url:NSURL = NSURL(fileURLWithPath: path as String)

        let managedModel:NSManagedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)!

        let storeCoordinator:NSPersistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedModel)

        do 
       try storeCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
        
        catch 
            print("Error: \(error)")
            

        let managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)

        managedObjectContext.persistentStoreCoordinator = storeCoordinator

        return managedObjectContext      
    

    class func insertManagedObject(className:NSString, managedObjectConect:NSManagedObjectContext)->AnyObject

        let managedObject:NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(className as String, inManagedObjectContext: managedObjectConect) as NSManagedObject

        return managedObject

    

    class func saveManagedObjectContext(managedObjectContext:NSManagedObjectContext)->Bool
        do 
            try managedObjectContext.save()
            return true
         catch _ 
            return false
        
        

    class func fetchEntities(className:NSString, withPredicate predicate:NSPredicate?, managedObjectContext:NSManagedObjectContext)->NSArray
        let fetchRequest:NSFetchRequest = NSFetchRequest()
        let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext)!

        fetchRequest.entity = entetyDescription
        if (predicate != nil)
            fetchRequest.predicate = predicate!
        

        fetchRequest.returnsObjectsAsFaults = false
        var items = NSArray()
        do  items = try managedObjectContext .executeFetchRequest(fetchRequest)
         catch 
            print("Fetch Request Failed")
        
        return items
       

产生错误的代码是:

let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext)!

我无法纠正错误。

【问题讨论】:

我强烈会避免那些建议 Foundation 类型 (NSString, NSDictionary) 而不是 Swift 本机类型 (String, Dictionary) 和 NSHomeDictionary() 而不是 URLForDirectory:inDomain:appropriateForURL:create: 的教程NSFileManager 指定应用程序容器中的目录。 使用NSBundle上的方法来获取目录位置是正确的方法。 【参考方案1】:

entityForName 返回一个可选值。它可能崩溃了,因为您使用 ! 强制解包此操作的结果

你可以在这种情况下使用可选绑定来测试entityForName是否真的返回一个值:

if let entityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext) 
    // work with entityDescription
 else 
   // handle the case in which entityForName returns nil

【讨论】:

是的,我强行输入!在let entetyDescription:NSEntityDescription = NSEntityDescription.entityForName(className as String, inManagedObjectContext: managedObjectContext) 的末尾,因为它显示了可选类型 NSEntityDescription 的值?没有打开,它会弹出一个修复! 是的,编译器在运行前发现错误并建议即时解决方案。不幸的是,这些解决方案并不总是权宜之计——就像在这种情况下一样。 是的,你能建议我解决这个错误吗?我无法解决它 什么意思?我想我已经用我的答案提出了解决方案。 我知道这要过一段时间了,但是对于其他来到这里的人来说,为了匹配 OP 的代码,这个解决方案应该说 if let entetyDescription = ... 而不是 if let entityDescription = ... - OP 将“实体”拼写为“实体” " 在他们自己的变量名称中,当他们显然将解决方案复制/粘贴到他们的代码中时,导致在他们的以下代码中 use of unresolved identifier 'entetyDescription' 消息。

以上是关于线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0) 错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift,线程 1:EXC_BAD_INSTRUCTION 错误

错误“线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)”是啥意思?

线程 1:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0*0) 错误

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_1386_INVOP,子代码=0x0)

SwiftUI:线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

iOS - Xcode 线程 1 EXC_BAD_INSTRUCTION