나는 3 × 아이폰 5의하는 5 초, 6, 기가, 그리고 7EXC_BAD_ACCESS 코드 = EXC_ARM_DA_ALIGN
내가 5 장치에만 아이폰의 모든에 위의 오류를 받고 있어요 내 코드를 테스트했습니다. 여기서 무슨 일이 벌어지고 있는지 모르겠지만 5 비트가 32 비트 장치라는 사실은 단서 일 수 있습니까?
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)
}
}
}
}
}
나는의 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 변수에서 다음 메소드를 호출하고있어 간단한 구조체이다 코드는 startRecording
방법의 다음 줄에서 폭격합니다.
try context.obtainPermanentIDs(for: [sessionInfo])
편집 :
내가 구성된 벗었 테스트 응용 프로그램을 만든 경우에만 CoreDataStack
입력 문자열의 하나 개의 속성을 가진 하나의 엔티티와 모델. 3x iPhone 5에서만 여전히 같은 오류가 발생합니다. 5s, 6, 6s, 7 모두 잘 작동합니다.
아마도 CoreDataStack
에 문제가있는 것입니까?
Github에서의 환매 특약 here
github 프로젝트에 CoreDataStack.swift 파일이 없습니다. 여기에서 복사하면 '로그'를 사용할 수 없습니다. '로그 아웃'하고 댓글을 달고 iPhone 5를 포함한 모든 시뮬레이터에서 '성공'을 얻습니다. 시뮬레이터 또는 실제 장비에서만 오류가 발생합니까? – oyalhi
이 문제에 대한 해결책이나 해결 방법을 찾으셨습니까? 나는 거의 같은 문제를 가지고 있으며 그것을 파악할 수 없다. –