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

时间:2014-01-05 08:44:49

标签: ios core-data crash chat quickblox

我使用Quickblox作为聊天应用,并使用核心数据存储消息历史记录。

当我登录聊天时,我重新发送上次无法发送的消息。 (即我从Core Data获取消息并获取未发送的消息)

有时候它有效,但有时候应用程序崩溃了helper方法(用于获取Core Data上下文):

+ (NSManagedObjectContext *)context {
    return ((AppDelegate *)[UIApplication sharedApplication].delegate).managedObjectContext;
}

我没有为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

这是我在DBHelper类中检索消息历史记录的方法

+ (NSMutableArray *)fetchMessagesWithSenderID:(NSString *)userID {

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:[DBHelper context]]; //the app crashes here, inside [DBHelper context]
    [fetchRequest setEntity:entity];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"sender.userID = %@", userID];
    [fetchRequest setPredicate:pred];


    NSError *error;

    NSMutableArray *fetchedObjects = [[DBHelper context] executeFetchRequest:fetchRequest error:&error].mutableCopy;
    return fetchedObjects;
}

记录:

2014-01-05 16:32:05.365 Chat[1517:60b] completedWithResult: <QBMRegisterSubscriptionTaskResult: 0x14e955e0>
2014-01-05 16:32:05.366 Chat[1517:60b] error: (
    "Invalid provisioning profiles. You have to use valid Provisioning Profiles for your project"
)
2014-01-05 16:32:06.549 Chat[1517:180f] QBChat/didConnect
2014-01-05 16:32:07.913 Chat[1517:4103] -[QBChat xmppStreamDidAuthenticate:] -> user: 573782, supportsStartTLS: 1, isSecure: 0
2014-01-05 16:32:07.913 Chat[1517:60b] chatDidLogin
2014-01-05 16:32:07.916 Chat[1517:60b] -[QBMGetTokenPerformer managedObjectContext]: unrecognized selector sent to instance 0x14d48800
(lldb) 

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

  

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

此行表示您已在类managedObjectContext的对象上调用QBMGetTokenPerformer方法,该方法无法识别该方法。

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

我可以建议您在应用程序中添加一个异常断点 - 尽管看起来您已经有了一个异常断点。您可以将您的方法分成不同的行,这样您就可以看到每个方法发生了什么。

答案 1 :(得分:0)

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

* .h文件:

@interface CoreDataService : NSObject

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

@end

* .m文件:

@implementation CoreDataService

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

 - (void)saveContext{   
 ... 
}