访问核心数据时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS

Posted

技术标签:

【中文标题】访问核心数据时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS【英文标题】:EXC_BAD_ACCESS KERN_INVALID_ADDRESS while accessing core data 【发布时间】:2017-06-19 09:49:59 【问题描述】:

我在应用委托中创建了一个通用函数,用于从应用中的任何位置访问核心数据。

- (NSMutableArray *)createFetchRequestWithPredicate:(NSPredicate *)predicate inEntity:(NSString *)str_entity 

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:str_entity];
        request.predicate = predicate;
        [request setReturnsObjectsAsFaults:NO];
        NSMutableArray *arr_records = [[[NSMutableArray alloc] initWithArray:[[self managedObjectContext] executeFetchRequest:request error:nil]] mutableCopy];
        return arr_records;

现在大多数时候这个功能都可以正常工作。但是大约一百次会导致崩溃并显示以下日志:

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000000432b2b10

任何人都可以解决问题所在。

【问题讨论】:

你为什么不至少使用error参数? @vadian 我尝试过使用 try catch。但这在这里不起作用,因为这是一个内存问题。所以我想使用错误参数是没有意义的。 ios 10 n 以上吗? @SandeepBhandari 它在 iOS 9 及更高版本上。 【参考方案1】:

我希望这是由于线程问题。由于它是通用函数并且可以从应用程序中的任何位置调用,请使用 @synchronize(self) 。还将 NSError 参数添加到 executeFetchRequest 方法并处理错误。

- (NSMutableArray *)createFetchRequestWithPredicate:(NSPredicate *)predicate inEntity:(NSString *)str_entity 
   @synchronize(self) 

     NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:str_entity];
     request.predicate = predicate;
     [request setReturnsObjectsAsFaults:NO];
     NSError *error = nil;

     NSMutableArray *arr_records = [[[NSMutableArray alloc] initWithArray:[[self managedObjectContext] executeFetchRequest:request error:&error]] mutableCopy];

      if (!error) 
       return arr_records;
       else 
        nil;
    

【讨论】:

if 仅在managedObjectContext 为nil 时才有用,但问题中的错误消息显示它不是nil。正如您所说,它可能已被释放,但它不是零。 我同意你的观点,但我提到这种方式的原因是 Rohitax Rajguru 已经尝试过错误但似乎对他不起作用。 当然,但那是不同的。您的代码有一个检查,在这种情况下不会有用。 @VinitIngale :它不适用于这种情况。 @TomHarrington:你有什么想法吗?

以上是关于访问核心数据时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS的主要内容,如果未能解决你的问题,请参考以下文章

设置核心数据对象的标量属性时的 EXC_BAD_ACCESS (IOS 5)

核心数据:EXC_BAD_ACCESS 访问关系

核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象

访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS

EXC_BAD_ACCESS:核心数据、NSFetchedResultsController 和 numberOfRowsInSection

非零整数值的核心数据 EXC_BAD_ACCESS