【发布时间】: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