Ios N错误释放:消息已发送到解除分配的实例
我在iOS 7应用程序上遇到崩溃,错误如下:Ios N错误释放:消息已发送到解除分配的实例,ios,objective-c,core-data,restkit,nserror,Ios,Objective C,Core Data,Restkit,Nserror,我在iOS 7应用程序上遇到崩溃,错误如下: -[NSError release]: message sent to deallocated instance 0x3c443fe0 当我添加对以下方法的调用时,会启动此错误: -(void)loadMessages:(NSString*)customerUID { NSString *formatUID = [NSString stringWithFormat:@"%s%@%s", "'", customerUID, "'"]; for
-[NSError release]: message sent to deallocated instance 0x3c443fe0
当我添加对以下方法的调用时,会启动此错误:
-(void)loadMessages:(NSString*)customerUID {
NSString *formatUID = [NSString stringWithFormat:@"%s%@%s", "'", customerUID, "'"];
formatUID = [formatUID stringByReplacingOccurrencesOfString:@"'" withString:@"%27"];
NSString *servicePath = [NSString stringWithFormat:@"/api/messagerecipient?messageid=null&customeruid=%@", formatUID];
[[RKObjectManager sharedManager] getObjectsAtPath:servicePath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *messagesResult)
{
NSArray *messageResults = messagesResult.array;
if (messageResults != nil || [messageResults count] != 0)
{
//Add some code here
}
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}];
}
我在代码中的不同位置添加了多个断点,它不会返回任何错误详细信息。此外,控制台日志中没有任何内容表明问题所在(我添加了完整的RestKit日志记录),只是上面的NSError
release消息
我还对仪器进行了僵尸扫描。它显示了以下内容
我很困惑,因为这表明僵尸是由GSEventRunModal
调用创建的。当我转到“扩展详细信息”并选择通话时,会显示以下内容:
任何指点都将不胜感激,谢谢
更新:仪器扩展详细信息堆栈跟踪
是否可能是您试图从块内部显示AlertView?与UI的交互必须在主线程上
您能否尝试替换:
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
与:
尽管我猜init方法无论如何都会得到一个字符串。我认为你的问题不在于它本身的方法 错误消息表示您正在向NSERROR类型的对象发送释放调用 请检查包含您正在调用的方法的类的实例,并确保它未被解除分配
或者将调用方法添加到问题中,以便我们进行检查。我也经常看到这一点,问题的根源似乎是核心数据。我使用MagicalRecord数据库库(RestKit也是如此),我们认为错误就在那里。你可以看到一个讨论。在我们所有的调查之后,MagicalRecord似乎是正确的,核心数据是错误的
这实际上是作为一个bug提交的,苹果声称已经修复了这个bug,但我们仍然看到它。我能够解决这个问题的唯一方法是阻止每个我可能无法保存数据的实例,这样就不会报告错误。您可以在上面链接的讨论线程中看到其中的一些提示。在我的例子中,将数据库线程化到单独的上下文会有所帮助。我在接收消息的类上使用了以下构造函数:
-(id)init {
self = [super init];
if (self) {
self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
self.managedObjectContext.parentContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
self.managedObjectContext.retainsRegisteredObjects = YES;
}
return self;
}
那么,是什么让你认为这与RestKit有关?如果您不拨打RestKit电话,那么您就没有问题了?是的,这是正确的,但不确定它是否与RestKit相关。命中的最后一个断点位于AFURLConnectionOperation、operationDidStart方法中。似乎引发错误的进程是CFRunLoopRun。您的映射应该创建托管对象并插入到存储中吗?发出此请求时,您有哪些未保存的内容?您同时还对核心数据做了什么?对于分配了
NSError
的站点,从扩展详细信息窗格中查看整个堆栈跟踪将非常有用。僵尸不是由GSEventRunModal
创建的。当您在GSEventRunModal
中看到一个发布时,这是一个自动释放池。事件历史记录中的最后一行(第7行)是一个额外的版本(被发送到第6行中成为僵尸的NSError
),因为NSError
被自动删除了太多次。虽然它没有解决我的问题-你的回答很好地解释了问题所在-因此授予你奖金。。为你的帮助干杯!
-(id)init {
self = [super init];
if (self) {
self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
self.managedObjectContext.parentContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
self.managedObjectContext.retainsRegisteredObjects = YES;
}
return self;
}