线程 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)