【问题标题】:Why does my iOS app crash while saving model object to managedObjectContext为什么我的 iOS 应用程序在将模型对象保存到 managedObjectContext 时崩溃
【发布时间】:2015-09-21 05:01:12
【问题描述】:

我在数据库中添加模型对象时遇到了这个崩溃,我已经象征性地崩溃了,

这是崩溃的堆栈跟踪

SIGSEGV SEGV_MAPERR

libobjc.A.dylib 0x366746ba objc_retain + 8 1
基础 0x2907887d _encodeObject + 1066 2
基础 0x29079a6f -[NSKeyedArchiver _encodeArrayOfObjects:forKey:] + 400 3
基础 0x2907a051 -[NSArray(NSArray) encodeWithCoder:] + 182 4
基础 0x2907887d _encodeObject + 1066 5
MyApp 0x000d3da3 -[WorkOrder encodeWithCoder:] (WorkOrder.m:97) 6
基础 0x2907887d _encodeObject + 1066 7
基础 0x2907ebd9 +[NSKeyedArchiver archivedDataWithRootObject:] + 154 8
CoreData 0x2809c861 -[NSSQLiteConnection 执行] + 1762 9
CoreData 0x280d99af -[NSSQLiteConnection updateRow:] + 544 10
CoreFoundation 0x283a8965 ____NSDictionaryEnumerate_block_invoke421 + 22 11
CoreFoundation 0x282b8740 CFBasicHashApply + 118 12
CoreFoundation 0x283a6367 __NSDictionaryEnumerate + 268 13
CoreData 0x2816bdf3 -[NSSQLCore writeChanges] + 544 14
CoreData 0x280d493d -[NSSQLCore saveChanges:] + 854 15
CoreData 0x280a2b25-[NSSQLCore executeRequest:withContext:error:] + 734 16
CoreData 0x28154a35 __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 3622 17
CoreData 0x2815ca13 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 260 18
libdispatch.dylib 0x36bc52cf _dispatch_client_callout + 20 19
libdispatch.dylib 0x36bcca3d _dispatch_barrier_sync_f_invoke + 46 20
核心数据 0x2814ef8d _执行 + 134 21
CoreData 0x280a2703-[NSPersistentStoreCoordinator 执行请求:withContext:错误:] + 312 22
CoreData 0x280c47d1 -[NSManagedObjectContext 保存:] + 854 23
MyApp 0x0011f83f __37-[WorkOrderManagement saveWorkOrder:]_block_invoke (WorkOrderManagement.m:96) 24
libdispatch.dylib 0x36bc52e3 _dispatch_call_block_and_release + 8 25
libdispatch.dylib 0x36bcf381 _dispatch_root_queue_drain + 1386 26
libdispatch.dylib 0x36bd03c3 _dispatch_worker_thread3 + 92 27
libsystem_pthread.dylib 0x36d2cdc1 _pthread_wqthread + 666 28
libsystem_pthread.dylib 0x36d2cb14 start_wqthread + 6

这是我的代码。 符号化后发现疑似crash的行在此代码块中是
[coder encodeObject:self.lstSelectedEmployees forKey:@"lstSelectedEmployees"];

任何帮助将不胜感激。

-(void) encodeWithCoder:(NSCoder *)coder {
        [coder encodeObject:self.workOrderID forKey:@"workOrderID"];
        [coder encodeObject:self.projectID forKey:@"projectID"];
        [coder encodeObject:self.locationID forKey:@"locationID"];
        [coder encodeObject:self.service forKey:@"service"];
        [coder encodeObject:self.suggestedQty forKey:@"suggestedQty"];
        [coder encodeObject:self.note forKey:@"note"];
        [coder encodeInt:self.appDuration forKey:@"appDuration"];
        [coder encodeObject:self.forDate forKey:@"forDate"];
        [coder encodeObject:self.quantity forKey:@"quantity"];
        [coder encodeObject:self.lstPictures forKey:@"lstPictures"];
        [coder encodeObject:self.lstAudios forKey:@"lstAudios"];
        [coder encodeObject:self.startTime forKey:@"startTime"];
        [coder encodeObject:self.endTime forKey:@"endTime"];
        [coder encodeObject:self.comments forKey:@"comments"];
        [coder encodeObject:self.assignedToEmployeeName forKey:@"assignedToEmployeeName"];
        [coder encodeBool:self.isDone forKey:@"isDone"];
        [coder encodeBool:self.isPartial forKey:@"isPartial"];
        [coder encodeObject:self.lstSelectedEmployees forKey:@"lstSelectedEmployees"];
        [coder encodeObject:self.lstSelectedEquipment forKey:@"lstSelectedEquipment"];
        [coder encodeObject:self.lstSelectedMaterials forKey:@"lstSelectedMaterials"];
        [coder encodeObject:self.selectedVehicle forKey:@"selectedVehicle"];
        [coder encodeInt:self.qtySelectedIndex forKey:@"qtySelectedIndex"];
        [coder encodeInteger:self.elapsedCount forKey:@"elapsedCount"];
        [coder encodeBool:self.counterRunning forKey:@"counterRunning"];
        [coder encodeObject:self.lstEmployees forKey:@"lstEmployees"];
        [coder encodeObject:self.lstEquipment forKey:@"lstEquipment"];
        [coder encodeObject:self.lstChecklist forKey:@"lstChecklist"];
        [coder encodeBool:self.locationChecklistAdded forKey:@"locationChecklistAdded"];
        [coder encodeObject:self.scaleValue forKey:@"scaleValue"];
        [coder encodeObject:self.lstChecklistitems forKey:@"lstChecklistitems"];
 }

【问题讨论】:

    标签: ios objective-c core-data crash encoder


    【解决方案1】:

    崩溃前要编码的最后一个对象是 NSArray,请确保该数组中的对象是允许的属性列表类型

    【讨论】:

    • self.lstSelectedEmployees 是 Employee 对象的 nsmutablearray,
    • 如何确保数组中的对象是允许的属性类型?
    • 允许的基本类型是 NSString、NSNumber、NSDate、NSData 和集合类型 NSArray 和 NSDictionary,它们也必须包含符合属性列表的类型。自定义类型必须使用 encodeWithCoder 编码并使用 NSKeyedArchiver 归档
    • 先生,如何编码 NSmutableArray 以存储是 NSObject 并返回,如果我正在编码 NSmutableArray 怎么办?像下面? [编码器 encodeObject:self.lstSelectedEmployees forKey:@"lstSelectedEmployees"];
    • 解码后可变数组调用mutableCopy方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多