我觉得我开始在这个问题上失去理智.
我已经开始使用SDK提供的生成的CoreData代码处理CoreData iOS应用程序.每当我尝试实例化实体的新实例以便我可以保存它时,就会出现问题.
根据Apple CoreData教程,我的AppDelegate里面有我的实例化代码(我在那里移动了一堆代码,试图调试这个问题):
NSManagedObjectContext* context = [self managedObjectContext]; if (!context) { NSLog(@"Error"); // I'm not too concerned about my error handling just yet }
在那之后,这是产生我正在经历的错误的行:
Vehicle* vehicle = (Vehicle*)[NSEntityDescription insertNewObjectForEntityForName:@"Vehicle" inManagedObjectContext:context];
有问题的错误是:
Thread 1: EXC_BAD_ACCESS (code=EXC_ARM_DA_ALIGN address=0xdeadbeef)
总而言之,除了存在内存对齐问题(ARMv7常见的问题)之外,我真的不知道这意味着什么,而我在谷歌上发现的资源并没有帮助我.
唯一的其他相关代码是Xcode在生成项目时提供的’managedObjectContext’方法,因为这是首先生成managedObjectContext的原因:
- (NSManagedObjectContext *)managedObjectContext { if (__managedObjectContext != nil) { return __managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { __managedObjectContext = [[NSManagedObjectContext alloc] init]; [__managedObjectContext setPersistentStoreCoordinator:coordinator]; } return __managedObjectContext; }
就像我说的那样,我离开了我的深度.任何人都可以提供一些清晰的说明,我怎么可能解决这个问题?
解决方法
很可能没有初始化__managedObjectContext(因此其值为0xdeadbeef),当尝试从中读取值时,这会导致EXC_ARM_DA_ALIGN作为副作用.
@Kenny Winker
EXC_ARM_DA_ALIGN通常来自非实际类型的访问指针值.例如
char buf[8]; double d = *((double *)buf); // this may cause EXC_ARM_DA_ALIGN
但它也可能导致指针无效,在本例中为0xdeadbeef.例如
double *ptr; // not initialized double d = *ptr; // this is undefined behavIoUr,which may cause EXC_ARM_DA_ALIGN or other error
>检查所有指针转换(即(double *)(void *)ptr)并尽可能避免它们.>确保所有内容都已初始化.>当它崩溃时,找出导致它崩溃的变量,并尝试追溯以找出值来自何处.使用调试器来查看内存位置有助于找出变量的所有更改.