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错误

核心数据:EXC_BAD_ACCESS 访问关系

SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”

Coredata 和 Mogenerator,coredata 标志并发问题 EXC_BAD_INSTRUCTION

Coredata 迁移崩溃

我在 iOS 中有一些问题 swift 核心数据