访问核心数据时的 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)
核心数据 - 访问从 fetch EXC_BAD_ACCESS 返回的对象
访问 NSManagedObject 的属性时的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS
EXC_BAD_ACCESS:核心数据、NSFetchedResultsController 和 numberOfRowsInSection