iOS:[self.fetchedResultsController performFetch:&error];让我的应用崩溃

Posted

技术标签:

【中文标题】iOS:[self.fetchedResultsController performFetch:&error];让我的应用崩溃【英文标题】:iOS: [self.fetchedResultsController performFetch:&error]; makes my app to crash 【发布时间】:2011-05-11 07:09:34 【问题描述】:

我有一个 UITableViewController,我想为它提供核心数据模型的内容。 但是,当我获取内容时,我的应用程序崩溃了。这是 init 方法(我将 NSManagedObjectContext 传递给它)。

- (id)initInManagedObjectContext:(NSManagedObjectContext *)context

    self = [super initWithStyle:UITableViewStylePlain];

    if (self) 
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        request.entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context];
        request.predicate = nil;    
        request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"idDoc" 
                                                                                     ascending:YES]];
         /*
         NSError *error = nil;
         NSManagedObject *retrievedDocument = [[context executeFetchRequest:request error:&error] lastObject];
         NSLog(@"retrievedDocument %@", retrievedDocument);
         */

        NSFetchedResultsController *frc = [[NSFetchedResultsController alloc]
                                             initWithFetchRequest:request 
                                             managedObjectContext:context 
                                               sectionNameKeyPath:nil 
                                                        cacheName:@"CollectionCache"];

        self.fetchedResultsController = frc;
        [frc release];
        [request release];


        //HERE IT CRASHES
        NSError *error;
        [self.fetchedResultsController performFetch:&error];

        if (error) 
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            //exit(-1);  // Fail
        

    
    return self;

我确定上下文已正确传递,因为如果我取消注释已注释的 sn-p,则存储的数据将正确打印。

我的猜测是 fetchedResultsController 出了点问题。

谢谢

【问题讨论】:

崩溃发生后堆栈跟踪和控制台说什么? @Nick Weaver 控制台什么也没说。 xCode 高亮显示实例 DisplayResutsTableViewController *resultsTableView = [[DisplayResutsTableViewController alloc] initInManagedObjectContext:self.managedObjectContext];带有以下消息:“线程 1:程序接收到的信号:”EXC_...”我无法阅读完整的消息,但我想这是关于内存访问的。 @Patrick Enable NSZombie 为您的活动可执行文件,看看控制台输出是否产生新的东西。 @Nick Weaver 我已经在我的 xCode4 (d.pr/vuye) 中设置了它,我还尝试从你的链接中添加代码行,看看它是否有效。仍然检测到他们线路中的 BAD Memory Access 错误,但我的控制台仍然没有说任何东西,奇怪。 嗯,好吧,让我们尝试划掉一些东西:属性 fetchedResultsController 是如何声明的? 【参考方案1】:

异常与您错误使用performFetch:有关

它返回一个 BOOL,告诉您获取成功。如果你得到一个 NO 返回,你就可以检查 NSError 对象。否则你不能碰它。

可能所有使用 &error 的方法都应该这样使用:

    NSError *error;
    if (![self.fetchedResultsController performFetch:&error]) 
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        //exit(-1);  // Fail
    

【讨论】:

【参考方案2】:

异常与 fetchedResultsController 无关,但由于未初始化 NSError

NSError *error = nil;

【讨论】:

您没有正确使用 API。见Handling Error Objects Returned from Methods。

以上是关于iOS:[self.fetchedResultsController performFetch:&error];让我的应用崩溃的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别