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