访问核心数据时EXC_BAD_ACCESS KERN_INVALID_ADDRESS

时间:2017-06-19 09:49:59

标签: ios objective-c core-data nsmanagedobjectcontext iphonecoredatarecipes

我在app delegate中创建了一个通用函数,可以从应用程序的任何位置访问核心数据。

- (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

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

1 个答案:

答案 0 :(得分:0)

我希望这是由于线程问题。由于它是通用函数,可以从应用程序的任何位置调用,因此请使用@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;
    }
}