【问题标题】:iPhone iOS 4 Core Data - Program received signal: “EXC_BAD_ACCESS”iPhone iOS 4 Core Data - 程序收到信号:“EXC_BAD_ACCESS”
【发布时间】:2011-05-08 18:28:42
【问题描述】:

我正在尝试基于 Apple 的示例项目 TheElements 创建一个应用,但使用 Core Data 作为模型。在核心数据中,我有 4 个相关的数据库表。在 UI 中,我有几个 tableViews,每个都显示来自不同 Db 表的行。单击 tableView 中的一行可以深入到相关表中的项目,显示在另一个 TableView 中。

一切正常,但应用程序在随机时间意外崩溃并出现错误:程序收到信号:“EXC_BAD_ACCESS”。顺便说一句,此错误仅在设备上调试时显示在控制台中。在模拟器上调试时没有错误显示。这个screen grab 显示了崩溃后调试器的内容。

我不知道如何破译调试器。我所看到的只是崩溃似乎源于 main() 函数,并且还列出了 _PFManagedObjectReferenceQueue,这导致我猜测我在使用 Core Data 时做错了。

为了实现 Core Data,我将以下内容添加到我的 App Delegate 标头中:

@private  
    NSManagedObjectContext *managedObjectContext_;  
    NSManagedObjectModel *managedObjectModel_;  
    NSPersistentStoreCoordinator *persistentStoreCoordinator_;  

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

并将 Apple 的默认方法添加到 App Delegate 实现文件中。

然后在我添加的数据源协议标头中:

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;  
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;`

而我的Data Source头文件如下:

#import <UIKit/UIKit.h>  
#import <CoreData/CoreData.h>  
#import "TableViewDataSourceProtocol.h"  

@interface MatchesAllDataSource : NSObject <UITableViewDataSource,TableViewDataSource, NSFetchedResultsControllerDelegate>  
{  
 NSFetchedResultsController *fetchedResultsController;  
 NSManagedObjectContext *managedObjectContext;  
}  

@end

单击表格单元格时,我按如下方式传递 selectedObject:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath  
{  
 // deselect the new row using animation  
    [tableView deselectRowAtIndexPath:newIndexPath animated:YES];  

 // get the element that is represented by the selected row.  
 Match *selectedMatch = [dataSource objectForIndexPath:newIndexPath];  

 // create an AtomicElementViewController. This controller will display the full size tile for the element  
 MatchViewController *matchController = [[MatchViewController alloc] init];  

 // set the element for the controller  
 matchController.selectedMatch = selectedMatch;  

 // push the element view controller onto the navigation stack to display it  
 [[self navigationController] pushViewController:matchController animated:YES];  
 [matchController release];  
}`

有谁知道是什么导致了我的崩溃? 有人能指点我寻找答案的正确方向吗?
有没有更好的方法来实现具有多个 tableViews 的 Core Data? 有人会给我指出一个具有多个 tableViews 的 Core Data 的好例子吗?

【问题讨论】:

  • 您的第一个线索是堆栈跟踪中存在objc_msgSend。 99.9% 的时间,这表明您正在向已释放的对象发送消息。仔细检查相关对象是否得到正确管理。这可能会有所帮助,尤其是关于僵尸的部分:touch-code-magazine.com/how-to-debug-exc_bad_access
  • 我对此表示赞同,并将此 cocoadev.com/index.pl?NSZombieEnabled> 添加为另一个有用的资源。

标签: uitableview core-data ios crash


【解决方案1】:

几天前我有这个。就我而言,我正在访问一个已经被释放的对象。

【讨论】:

  • 我也可以从错误中看到问题出在title,但我所有的观点都有标题,所以这对我缩小范围没有多大帮助:-(
  • 顺便说一句,我正在使用 Marcus Crafter 的 SegmentedControlExample:redartisan.com/2010/6/27/…,它确实:self.segmentedControl = [[UISegmentedControl alloc] initWithItems:[viewControllers arrayByPerformingSelector:@selector(title)]]; 但是在初始化分段控制器时会调用它,并且应用程序在返回导航时往往会崩溃,但不是总是...
【解决方案2】:

当用户向下导航 navigationController 视图时,我还将 managedObjectContext 对象从一个视图传递到另一个视图,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath 
{
    matchSegmentedController.selectedMatch = selectedMatch;
    matchSegmentedController.managedObjectContext = dataSource.managedObjectContext; 

【讨论】:

    【解决方案3】:

    我在使用 Marcus 的代码时也遇到了这个问题,因为我将 UITableViewController 更改为常规 UIViewController 并忘记输入标题。这是他的原始代码:

    - (id)initWithStyle:(UITableViewStyle)style {
    if (self = [super initWithStyle:style]) {
        self.title = @"Australia";
    }
    return self;
    

    }

    因此,如果您碰巧更改了内容,请确保将 self.title 设置在某处,以便自定义 NSArray+PerformSelector 在应用初始化时可以看到它……就像在 init 中一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2010-09-24
      • 2023-03-09
      相关资源
      最近更新 更多