iOS:生成的 CoreData 代码中的 EXC_ARM_DA_ALIGN
Posted
技术标签:
【中文标题】iOS:生成的 CoreData 代码中的 EXC_ARM_DA_ALIGN【英文标题】:iOS: EXC_ARM_DA_ALIGN in generated CoreData code 【发布时间】:2012-06-09 04:06:45 【问题描述】:我觉得我开始在这个问题上失去理智了。
我已经开始使用 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 中很常见?)而且我在 Google 上找到的资源对我没有任何帮助。
唯一的其他相关代码是 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;
就像我说的那样,我在这里已经超出了我的深度。谁能提供一些关于我如何解决这个问题的说明?
【问题讨论】:
xcdatamodeld
中的数据模型定义正确吗?
根据我在 CoreData 上找到的所有文档以及 Apple 提供的相应教程,是的。
尝试 1) 产品 - 清洁。 2)重启Xcode。
这不是关于对齐,而是关于未初始化/释放的内存0xdeadbeef
。你是如何初始化__managedObjectContext
的?
尝试在 didFinishLaunchingWithOptions 中将 _managedObjectContext 设置为 nil。
【参考方案1】:
__managedObjectContext
可能未初始化(因此具有 0xdeadbeef
的值),这会导致 EXC_ARM_DA_ALIGN
在尝试从中读取值时产生副作用。
@肯尼·温克
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
)并尽可能避免它们。
确保一切都已初始化。
当它崩溃时,找出导致它崩溃的变量并尝试回溯以找出值的来源。使用调试器查看内存位置有助于找出变量的所有更改。
【讨论】:
【参考方案2】:我认为显示正在运行的核心数据堆栈可能会有所帮助。我还将展示部分对象图..
pragma mark -
#pragma mark Core Data stack
/**
Returns the managed object context for the application.
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
*/
- (NSManagedObjectContext *)managedObjectContext
// NSLog(@"%s", __FUNCTION__);
if (managedObjectContext_ != nil)
return managedObjectContext_;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
managedObjectContext_ = [[NSManagedObjectContext alloc] init];
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
return managedObjectContext_;
/**
Returns the managed object model for the application.
If the model doesn't already exist, it is created from a starter file.
*/
- (NSManagedObjectModel *)managedObjectModel
//NSLog(@"%s", __FUNCTION__);
if (managedObjectModel_ != nil)
return managedObjectModel_;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DreamCatching" withExtension:@"mom"];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return managedObjectModel_;
/**
Returns the persistent store coordinator for the application.
If the coordinator doesn't already exist, it is created and the application's store added to it.
*/
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
//NSLog(@"%s", __FUNCTION__);
if (persistentStoreCoordinator_ != nil)
return persistentStoreCoordinator_;
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"DreamCatching.sqlite"];
// If the expected store doesn't exist, copy the default store.
//COMMENT / UNCOMMENT THIS TO LOAD / NOT LOAD THE STARTER FILE.
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:storePath])
NSError *error;
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Starter" ofType:@"sqlite"];
if ([[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error])
NSLog(@"Copied starting data to %@", storePath);
else
NSLog(@"Error copying default DB to %@ (%@)", storePath, error);
// to below here
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL options:nil error:&error])
NSLog(@"Error - App Delegate Creating DB %@, %@", error, [error userInfo]);
abort();
return persistentStoreCoordinator_;
#pragma mark -
#pragma mark Application's Documents directory
/**
Returns the path to the application's Documents directory.
NB SETTINGS ARE NOT IN THIS DIRECTORY, THEY ARE IN THE APPS BUNDLE. CONTROL-CLICK THE APP TO SEE CONTENTS, CONTROL-CLICK THE BUNDLE TO SEE THE PREFS
*/
- (NSString *)applicationDocumentsDirectory
//NSLog(@"%s", __FUNCTION__);
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
和模型:
【讨论】:
以上是关于iOS:生成的 CoreData 代码中的 EXC_ARM_DA_ALIGN的主要内容,如果未能解决你的问题,请参考以下文章
删除coredata列表项时SwiftUI App崩溃EXC_BAD_ACCESS错误
SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”