Основные данные iPhone iOS 4 - программа получила сигнал: «EXC_BAD_ACCESS» - PullRequest
0 голосов
/ 12 ноября 2010

Я пытаюсь создать приложение на основе примера проекта Apple TheElements, но использую Core Data для модели.В Core Data у меня есть 4 связанных таблицы БД.В пользовательском интерфейсе у меня есть несколько табличных представлений, каждый из которых показывает строки из другой таблицы БД.При щелчке строки в табличном представлении происходит детализация элементов в связанной таблице, показанной в другом табличном представлении.

Все работает, но приложение неожиданно зависает в случайное время с ошибкой: Программа получила сигнал: «EXC_BAD_ACCESS».Кстати, эта ошибка отображается только в консоли при отладке на устройстве.Ошибка не отображается при отладке на симуляторе.Этот снимок экрана показывает содержимое отладчика после сбоя.

Я понятия не имею, как расшифровать отладчик.Я вижу только то, что сбой происходит из-за функции main (), а также указан _PFManagedObjectReferenceQueue, что наводит на мысль, что я что-то не так делаю с Core Data.

Для реализации Core Data ядобавив следующее в заголовок моего делегата приложения:

@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 по умолчанию для них в файл реализации делегата приложения.

Затем в мой заголовок протокола источника данных, который я добавил:

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

и мои файлы заголовков источника данных выглядят следующим образом:

#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];  
}`

Кто-нибудь есть какие-либо идеи, что может быть причиной моего сбоя?Кто-нибудь, пожалуйста, укажет мне правильное направление, чтобы найти ответ?
Есть ли лучший способ реализовать Core Data с несколькими tableViews?Кто-нибудь подскажет мне хороший пример Core Data с несколькими tableViews?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2010

Также я передаю объект managedObjectContext из представления в представление, когда пользователь перемещается вниз по представлениям navigationController, например:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath 
{
    matchSegmentedController.selectedMatch = selectedMatch;
    matchSegmentedController.managedObjectContext = dataSource.managedObjectContext; 
0 голосов
/ 31 января 2011

У меня тоже была эта проблема с кодом Маркуса, потому что я изменил UITableViewController на обычный UIViewController и забыл вставить название.Вот его оригинальный код:

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

}

Так что, если вы изменили что-то, убедитесь, что вы устанавливаете self.title где-то, чтобы пользовательский NSArray + PerformSelector мог видеть егокогда приложение инициализируется ... как в init.

0 голосов
/ 12 ноября 2010

У меня было это несколько дней назад.В моем случае я получал доступ к объекту, который уже был освобожден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...