iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – EXC_BAD_ACCESS代码= EXC_ARM_DA_ALIGN大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我用3 x iPhone 5,5s,6,6s和7测试了我的代码.

我只在所有iPhone 5设备上收到上述错误.不知道这里发生了什么,但也许这个5位是32位设备的事实可能是一个线索?

我从viewcontroller类调用以下方法

func startRecording() {
    disableControls()

    CoreDataStack.shared.performForegroundTask { (context) in
            let sessionInfo = SessionInfo(context: context)
            sessionInfo.startTime = Date().timeIntervalSince1970
            sessionInfo.userId = self.config.userId
            sessionInfo.devicePosition = self.config.devicePosition.rawValue
            sessionInfo.deviCEType = self.config.deviCEType.rawValue
            sessionInfo.devicenumber = self.config.devicenumber
            sessionInfo.deviceSide = self.config.deviceSide.rawValue

            do {
                    try context.obtainPeRMANentIDs(for: [sessionInfo])
            } catch {
                    print("Error obtaining peRMANent ID for session info record")
                    return
            }

            CoreDataStack.shared.saveViewContextAndWait()

            DispatchQueue.main.async {
                    guard sessionInfo.objectID.istemporaryID == false else {
                            print("ObjectID is temporary")
                            return
                    }

                    self.recording = true
                    self.statusLabel.text = "Recording..."
                    self.recordManager.start(sessionUID: sessionInfo.uid)
            }
    }
}

config变量是一个简单的结构:

struct Configuration {
    var userId: String = "UnkNown"
    var deviCEType: DeviCEType = .phone // enum: String
    var deviceSide: DeviceSide = .notApplicable // enum: String
    var devicenumber: Int16 = 1 
    var devicePosition: DevicePosition = .waist  // enum: String
}

CoreDataStack在这里

final class CoreDataStack {
    static let shared = CoreDataStack()
    private init() {}

    var errorHandler: (Error) -> Void = { error in
            log.error("\(error),\(error._userInfo)")
    }

    private struct constants {
            static let persistentStorename = "Model"
    }

    private lazy var persistentContainer: NSPersistentContainer = {
            let container = NSPersistentContainer(name: constants.persistentStoreName)
            container.loadPersistentStores(completionHandler: { [weak self] (storeDescription,error) in
                    if let error = error {
                            self?.errorHandler(error)
                    }
            })
            return container
    }()

    lazy var viewContext: NsmanagedObjectContext = {
            self.persistentContainer.viewContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
            self.persistentContainer.viewContext.automaticallymergesChangesFromParent = true
            try! self.persistentContainer.viewContext.setQueryGenerationFrom(.current)
            return self.persistentContainer.viewContext
    }()

    private lazy var BACkgroundContext: NsmanagedObjectContext = {
            let context = self.persistentContainer.newBACkgroundContext()
            context.mergePolicy = NSMergePolicy.mergeByPropertyStoreTrump
            return context
    }()

    func performForegroundTask(_ block: @escaping (NsmanagedObjectContext) -> Void) {
            self.viewContext.perfoRMANdWait {
                    block(self.viewContext)
            }
    }

    func performBACkgroundTask(_ block: @escaping (NsmanagedObjectContext) -> Void) {
            BACkgroundContext.perform {
                    block(self.BACkgroundContext)
            }
    }

    func saveBACkgroundContext() {
            viewContext.perfoRMANdWait {
                    do {
                            if self.viewContext.hasChanges {
                                    try self.viewContext.save()
                            }
                    } catch {
                            self.errorHandler(error)
                    }

                    self.BACkgroundContext.perform {
                            do {
                                    if self.BACkgroundContext.hasChanges {
                                            try self.BACkgroundContext.save()
                                            self.BACkgroundContext.refreshAllObjects()
                                    }
                            } catch {
                                    self.errorHandler(error)
                            }
                    }
            }
    }

    func saveViewContext() {
            viewContext.perform {
                    if self.viewContext.hasChanges {
                            do {
                                    try self.viewContext.save()
                            } catch {
                                    self.errorHandler(error)
                            }
                    }
            }
    }

    func saveViewContextAndWait() {
            viewContext.perfoRMANdWait {
                    if self.viewContext.hasChanges {
                            do {
                                    try self.viewContext.save()
                            } catch {
                                    self.errorHandler(error)
                            }
                    }
            }
    }
}

代码在startRecording方法的下一行轰炸:

try context.obtainPeRMANentIDs(for: [sessionInfo])

编辑:

我创建了一个精简测试应用程序,它只包含CoreDataStack和一个带有一个属性类型为String的实体的模型.我仍然只在3x iPhone 5上出现同样的错误. 5s,6s,7都可以正常工作.

这可能意味着问题在于CoreDataStack吗?

Github回购here

解决方法

有几个人问我是否解决了这个问题,所以这就是我所做的.这不是一个真正的解决方案,而是更多的解决方法.它可能不适合所有人,但为我工作.

我所做的只是删除线

try! self.persistentContainer.viewContext.setQueryGenerationFrom(.current)

来自CoreDataStack,问题消失了……

大佬总结

以上是大佬教程为你收集整理的ios – EXC_BAD_ACCESS代码= EXC_ARM_DA_ALIGN全部内容,希望文章能够帮你解决ios – EXC_BAD_ACCESS代码= EXC_ARM_DA_ALIGN所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。