NSError release:发送到解除分配的实例的消息

时间:2014-03-17 17:15:38

标签: 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, "'"];
  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版本消息。

我还在仪器中运行Zombie扫描。它显示以下内容。

Instruments

我很困惑因为这表明僵尸是通过GSEventRunModal电话创建的。当我转到扩展详细信息并选择呼叫时,它显示以下内容:

Extended Detail

非常感谢任何指示,谢谢。

更新:仪器扩展详细信息堆栈跟踪

enter image description here

4 个答案:

答案 0 :(得分:2)

我也看到了很多,问题的根源似乎是核心数据。我使用MagicalRecord数据库库(RestKit也是如此),我们认为错误就在那里。您可以看到讨论here。经过我们所有的调查后,似乎MagicalRecord是正确的,Core Data是错的。

这实际上已被提交为Apple声称已经修复的错误,但我们仍然看到它。我能够解决这个问题的唯一方法是阻止我可能无法保存数据的每个实例,因此不会报告错误。您可以在与上面链接的讨论主题中看到其中一些提示。

答案 1 :(得分:0)

你是否试图从一个块里面显示一个AlertView?与UI的交互必须在主线程上?

How do display a UIAlertView from a block on iOS?

答案 2 :(得分:0)

您可以尝试替换:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];

使用:

NSString * message = [error localizedDescription];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];

虽然我猜想init方法仍然是一个字符串。

答案 3 :(得分:0)

我认为你的问题不在于它自己的方法。

错误消息表明您正在向NSERROR类型的对象发送释放调用。

请检查包含您正在调用的方法的类的实例,并确保它未被释放。

或将调用方法添加到问题中,以便我们进行检查。