获取上下文时Core Data iOS应用程序崩溃

获取上下文时Core Data iOS应用程序崩溃,ios,core-data,crash,chat,quickblox,Ios,Core Data,Crash,Chat,Quickblox,我在聊天应用程序中使用Quickblox,并使用核心数据存储消息历史记录 当我登录聊天室时,我会重新发送上次发送失败的消息。(即,我从核心数据获取消息,并获取未发送的消息) 有时它可以工作,但有时应用程序在helper方法(用于获取核心数据上下文)上崩溃: 我没有为App Delegate更改任何内容,它只是一个正常的启用CoreData的AppDelegate: @interface AppDelegate : UIResponder <UIApplicationDelegate, QB

我在聊天应用程序中使用Quickblox,并使用核心数据存储消息历史记录

当我登录聊天室时,我会重新发送上次发送失败的消息。(即,我从核心数据获取消息,并获取未发送的消息)

有时它可以工作,但有时应用程序在helper方法(用于获取核心数据上下文)上崩溃:

我没有为App Delegate更改任何内容,它只是一个正常的启用CoreData的AppDelegate:

@interface AppDelegate : UIResponder <UIApplicationDelegate, QBActionStatusDelegate, QBChatDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;


@end
日志:

2014-01-05 16:32:05.365聊天[1517:60b]已完成,结果如下:
2014-01-05 16:32:05.366聊天[1517:60b]错误:(
“无效的设置配置文件。您必须为项目使用有效的设置配置文件”
)
2014-01-05 16:32:06.549聊天室[1517:180f]QBChat/didConnect
2014-01-05 16:32:07.913聊天室[1517:4103]-[QBChat XMPPSTREAMDIAuthenticate:]->用户:573782,支持开始:1,安全:0
2014-01-05 16:32:07.913聊天室
2014-01-05 16:32:07.916聊天[1517:60b]-[QBMGetTokenPerformer managedObjectContext]:发送到实例0x14d48800的选择器无法识别
(lldb)

-[QBMGetTokenPerformer managedObjectContext]:发送到实例0x14d48800的选择器无法识别

这一行表示您对类
QBMGetTokenPerformer
的对象调用了
managedObjectContext
方法,该类对象不识别该方法

从您问题中的代码和您显示的屏幕截图来看,这不应该发生-我不知道调用应用程序委托有时会返回不相关的对象-我唯一一次看到这种情况是由于内存管理问题,但应用程序委托实际上是单例的,因此无法重新分配其内存


我所能建议的就是在你的应用程序中添加一个异常断点——尽管看起来你已经有了一个。您也许可以将您的方法拆分为单独的行,以便可以看到每个行上发生了什么

尝试将所有CoreData逻辑从AppDelegate移动到单独的singleton:

*.h文件:

@interface CoreDataService : NSObject

 +(instancetype)instance;
 - (void)saveContext;

@end
@implementation CoreDataService

@property (readonly, strong, nonatomic) NSManagedObjectContext
*managedObjectContext;  
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;    
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator
*persistentStoreCoordinator;

 - (void)saveContext{   
 ... 
}
*.m文件:

@interface CoreDataService : NSObject

 +(instancetype)instance;
 - (void)saveContext;

@end
@implementation CoreDataService

@property (readonly, strong, nonatomic) NSManagedObjectContext
*managedObjectContext;  
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;    
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator
*persistentStoreCoordinator;

 - (void)saveContext{   
 ... 
}

内存管理问题可能会导致AppDelegate在内存中被覆盖,因此仍然有可能,尽管可能性不大。QBMGetTokenPerformer来自QuickBlox,但我认为它不会调用任何核心数据方法。(QuickBlox只是一个聊天框架,不需要核心数据)@OMGPOP-我意识到,这就是问题所在。不知何故,您为managedObjectContext请求的对象是错误的,因此,在请求应用程序委托时,您必须返回错误的对象。
@implementation CoreDataService

@property (readonly, strong, nonatomic) NSManagedObjectContext
*managedObjectContext;  
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;    
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator
*persistentStoreCoordinator;

 - (void)saveContext{   
 ... 
}