gpt4 book ai didi

ios - iOS-NSManagedObjectContext崩溃

转载 作者:行者123 更新时间:2023-12-01 18:05:56 24 4
gpt4 key购买 nike

我遇到了一些在测试,开发或使用过程中从未经历过的崩溃。

我可以在Fabric Dashboard上看到它们,它涉及NSManagedObjectContext。

这是StackTrace上的第一个调用:

CDFavori* fav = [CDFavori favoriWithIndicatif:homeFavoriteIndicatif context:[MyAppDelegate mainContext]];

CDFavori是一个表示CoreData对象的类,对它进行了扩展以实现一些方法(以便获取):
+(CDFavori *)favoriWithIndicatif:(NSString*)indicatif context:(NSManagedObjectContext*)context
{
if (nil == indicatif || nil == context)
return nil;

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"CDFavori"];
[request setPredicate:[NSPredicate predicateWithFormat:@"indicatif LIKE %@", indicatif]];

NSError *error = nil;
NSArray *favoris = [context executeFetchRequest:request error:&error];
CDFavori *fav = nil;

if (nil != error) {
DDLogError(@"Error = %@ (%@)", indicatif, error);
} else if (0 < [favoris count])
{
fav = [favoris objectAtIndex:0];
if (1 < [favoris count]) {
DDLogWarn(@"More than one object present in DB : %@", indicatif);
}
}
return favori;
}

崩溃不是来自这种方法,只是为了给您一些上下文。

问题来自AppDelegate和NSManagedObjectContext。

这是我的Core Data方法代码:
+(NSManagedObjectContext*)mainContext
{
return ((MyAppDelegate*)[UIApplication sharedApplication].delegate).managedObjectContext;
}

崩溃在这里:
- (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}

编辑-仅提及声明:

在标题中:
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

在.m文件中:
 #pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

答案后编辑:

您认为这样会更好吗?

删除此声明:
#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

并替换为:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
_managedObjectModel = [[NSManagedObjectModel alloc] init];
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] init];
}

这样会更好吗?使用相同的.h文件。

但是我必须更改所有变量,并更改只读属性?

最佳答案

我相信您有3个独立的问题:

  • ARC阴谋反对您

  • 尝试更换:
    CDFavori* fav = [CDFavori favoriWithIndicatif:homeFavoriteIndicatif context:[MyAppDelegate mainContext]];


    NSManagedObjectContext* context = [MyAppDelegate mainContext];
    CDFavori* fav = [CDFavori favoriWithIndicatif:homeFavoriteIndicatif context:context];

    我有一个类似的问题,并解决了它。原因是当创建上下文然后直接将其作为参数ARC传递时,在下一行释放该上下文。然后,managedObject没有上下文,它将崩溃。如果首先将其分配给局部变量,则ARC将在整个范围内保持上下文不变。这在调试环境中不会发生,因为ARC在此环境中的行为有所不同。
  • 您没有正确执行多线程操作

  • 下一个问题是为什么要释放上下文。尽管您没有显示任何错误的代码,但我怀疑这是在应用程序生命周期的早期发生的,并且有多个线程同时创建一个主上下文。因此,第一个调用将创建一个上下文并将其分配给 _managedObjectContext,然后分配第二个上下文,并释放第一个上下文。 (并且它不会保留在本地范围内,因此会导致崩溃)。

    在您的核心数据设置中,您仅应评估主线程上的 _managedObjectContext变量。我建议在 managedObjectContext方法的开头添加一个检查
    if (![NSThread mainThread]) {
    // log error to fabric
    //[[Crashlytics sharedInstance] recordError:...];
    return nil;
    }
  • 懒惰地创建核心数据可能会导致错误

  • 另外,我会在 _managedObjectContext启动时显式创建 application:didFinishLaunchingWithOptions:,而不是懒惰地创建它。懒惰地创建它时,您不知道确切的创建时间。而且,如果它是从后台线程创建的,则整个堆栈将被弄乱。懒惰地执行它并没有什么好处,因为您肯定会创建它以便向用户显示任何内容。
    您可以按原样保留代码,只需添加
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self managedObjectContext]; //force loading of context

    关于ios - iOS-NSManagedObjectContext崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44525171/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com