2012-11-08 118 views
1

好事实:SIGABRT在NSFetchedResultsController委托方法mergeChangesFromContextDidSaveNotification后

  • 我从服务器下载数据,并通过核心数据线约束,保存数据,并在后台MOC被保存时,主要的MOC被合并。
  • 所有的保存操作去确定
  • 此外商务部的合并发生,没有任何问题

的错误我在捉:

  • 当我与NSFetchedResultsController的UITableView活跃(即在屏幕上),并且正在进行保存,该应用程序崩溃了一个SIGABRT,它将我带到AppDelegate中的mergeChangesFromContextDidSaveNotification行。
  • 什么是最奇怪的部分是,当FRC的代表是零,或当它是我的视图控制器,但我没有实现任何FRC委托方法时,崩溃不会发生,我不有什么问题。但是当我实现任何委托方法(甚至是空的,没有一行代码)时,该应用程序崩溃的同一个错误。 这意味着该方法甚至没有被解雇,问题不在于这些方法的代码
  • 最奇怪的部分2 (检查更新2下):碰撞发生了[__NSCFNumber length]: unrecognized selector sent to instance,我不叫任何“长”属性在我CoreDataManager无论是在我的AppDelegate类

证人:控制台

<CoreDataManager.m:(338)> Saved data from server 
<AppDelegate.m:(352)> Will merge 
<CoreDataManager.m:(338)> Saved data from server 
<AppDelegate.m:(355)> Did merge 
<CoreDataManager.m:(338)> Saved data from server 
<AppDelegate.m:(352)> Will merge 
<AppDelegate.m:(355)> Did merge 
<CoreDataManager.m:(338)> Saved data from server 
<CoreDataManager.m:(338)> Saved data from server 
<CoreDataManager.m:(338)> Saved data from server 
<MyTableViewController.m:(134)> Fetched results controller did fetch 
<CoreDataManager.m:(338)> Saved data from server 
<CoreDataManager.m:(338)> Saved data from server 
<CoreDataManager.m:(338)> Saved data from server 
<AppDelegate.m:(352)> Will merge 
<CoreDataManager.m:(338)> Saved data from server 
[__NSCFNumber length]: unrecognized selector sent to instance 0x13318050 

一些代码 - 合并MOCS

- (void)managedObjectContextDidSave:(NSNotification *)notification 
{ 
    NSManagedObjectContext *sender = (NSManagedObjectContext *)[notification object]; 

    if ((sender != self.managedObjectContext) && 
     (sender.persistentStoreCoordinator == self.managedObjectContext.persistentStoreCoordinator)) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      DebugLog(@"Will merge"); 
      [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
      DebugLog(@"Did merge"); 
     }); 
    } 
} 

更新1

继Cocoanetics暗示,我创建了一个NSNumber的类别,以检查是谁打来的length。我得到你在下面看到的,并在崩溃[__NSCFNumber _fastCStringContents:]:无法识别的选择器发送到实例

enter image description here

更新2 启用僵尸没有帮助=(

回答

1

好吧,经过几个月和几个小时,我终于找到了解决方案。它的工作原理,我很想听听一些为什么的意见。

所以,正如我所说的,节省100%,以及合并通知。如果我将NSFetchedResultsController委托设置为零,则没有问题。但是,将委托设置为我的UIViewController,导致应用程序崩溃。

我认为这可能是,也许是由于我的代码时委托方法被触发。但该应用程序甚至在此之前崩溃。所以我跟着Cocoanetics提示,创建一个类别,并尝试找出谁正在调用对NSNumber对象的方法length。之后,我看到NSPredicate在坠毁之前打电话给- (BOOL)evaluateWithObject:(id)object;。以同样的方式,我做了一个类来覆盖它:

@interface NSPredicate (PractiPredicate) 
- (BOOL)evaluateWithObject:(id)object; 
@end 

@implementation NSPredicate (PractiPredicate) 

- (BOOL)evaluateWithObject:(id)object 
{ 
    NSLog(@"Evaluate was called. Object class %@", NSStringFromClass([object class])); 
    MyManagedObject *myManagedObject = object; 
    NSLog(@"Is fault? %d", myManagedObject.isFault); 
    NSLog(@"myManagedObject changed and already have propertyA? %d", myManagedObject.propertyA != nil); 
    return YES; 
} 

@end 

所以,我惊讶的是,它的工作,并产生TE以下日志:

评估被调用。对象类MyManagedObject

是错? 0

myManagedObject已更改并已拥有propertyA? 1

我决定打印“有问题吗?”因为我认为这个混乱与NSManagedObject错误有关,但是对于它所打印的内容来说,事实并非如此。

问题的意见:你认为可能在这里产生这个问题?

1

确保你只观测到来自其他MOCS的通知。如果您保存有这个触发另一个这样的通知和你可能会进入一个无限循环,在一次或两次迭代之后失败,因为一个对象已经被ARC发布了。

+0

感谢您的回答,请检查编辑。 –

+0

它总是[NSNumber长度]?尝试在NSNumber上创建一个类别并实现一个空长度方法。然后在那里放置一个中断点,并检查堆栈跟踪在哪里被调用。 – Cocoanetics

+0

是的,永远。我会尝试,再次感谢。 –

1

这听起来像是一个内存问题。检查ARC所有权限定符并启用NSZombies。启用NSZom bies将帮助你缩小过早释放的物体。

当您启用僵尸时,您将看到“发送到释放实例的消息”。检查哪个对象被过早释放并更新您的问题。

+0

嗨Mugunth。我启用了NSZombies,但它没有帮助。我一直在获取SIGABRT(Not EXC_BAD_ACCESS)... –

+0

通过启用僵尸,您仍然会崩溃,但至少错误将会有意义,而不是某些指向NSNumber的垃圾指针,尝试调用长度。你可以发表回应? – Mugunth

+0

我不明白,也许我没有做正确的方法? –

0

最有可能的问题不在于您发布的代码,而在于您如何处理获取的结果控制器委托中的更改。这些只是由合并触发。

+0

正如我在这个问题中所说的,即使我只有NSLog只有一个委托方法而没有实现其他方法,它也会崩溃。触发是问题,而不是方法本身。 –

0

我有同样的问题,在我的情况下,我发现崩溃的原因是一个不正确的谓词。我有一个这样的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"attribute > 0"]; 

其中属性是一个字符串。我改正它为:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"attribute.length > 0"]; 

现在,我的代码运行良好。请确保您检查代码中的所有谓词,因为这也可能是此次崩溃的原因。

相关问题