【问题标题】:EXC_BAD_ACCESS KERN_INVALID_ADDRESS while accessing core data访问核心数据时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS
【发布时间】: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 及更高版本上。

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


【解决方案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:你有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
相关资源
最近更新 更多