Как отобразить данные ядра на контроллере второго вида? - PullRequest
0 голосов
/ 05 октября 2010

Я работаю над своим первым приложением для iPhone с основными данными.Я использую контроллер навигации, и контроллер корневого представления отображает 4 строки.Нажатие на первую строку приводит меня ко второму контроллеру табличного представления.Однако, когда я нажимаю кнопку «Назад», повторяю нажатие строки, снова нажимаю кнопку «Назад» и нажимаю строку в третий раз, я получаю сообщение об ошибке.Я исследовал это в течение недели безуспешно.

Я могу легко воспроизвести ошибку:

  1. Создайте новое приложение на основе навигации, используйте Core Data для хранения, позвоните емуMyTest, который создает MyTestAppDelegate и RootViewController.
  2. Добавьте новый подкласс UIViewController, с UITableViewController и xib, назовите его ListViewController.
  3. Скопируйте код из RootViewController.h и .m в ListViewController., изменяя имена файлов соответствующим образом.Чтобы упростить код, я удалил конечный «_» из всех переменных.
  4. В RootViewController я добавил #import ListViewController.h, настроил массив для отображения 4 строк и перешел к ListViewController при нажатии на первую строку.

В ListViewController.m я добавил #import MyTestAppDelegate.h »и следующий код:

- (void)viewDidLoad {
    [super viewDidLoad];

 if (managedObjectContext == nil) {
        managedObjectContext = [(MyTestAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
 }
    ..
}

Последовательность, вызывающая ошибку: нажмите строку, нажмите, нажмитестрока, возврат, нажмите строка -> ошибка.managedObjectContext синтезируется в третий раз.Я ценю ваше терпение и вашу помощь, поскольку это не имеет смысла для меня.

ADDENDUM: У меня может быть частичное решение.http://www.iphonedevsdk.com/forum/iphone-sdk-development/41688-accessing-app-delegates-managed-object-context.html

Если я не освобождаю managedObjectContext в файле .m, ошибка исчезнет.Это нормально или это вызовет у меня проблемы?

 - (void)dealloc {
    [fetchedResultsController release];
    // [managedObjectContext release];
    [super dealloc];
}

ДОБАВЛЕНИЕ 2: См. Решение ниже.Извините за вопросы форматирования - это был мой первый пост.

1 Ответ

0 голосов
/ 06 октября 2010

Я думаю, что у меня есть ответ.

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

- (void)awakeFromNib {    
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    rootViewController.managedObjectContext = self.managedObjectContext;
}

и RootViewController имеет следующий код:

@interface PractitionerAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;

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

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

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

- (NSString *)applicationDocumentsDirectory;

@end

плюс

- (void)dealloc {

    [managedObjectContext_ release];
    [managedObjectModel_ release];
    [persistentStoreCoordinator_ release];

    [navigationController release];
    [window release];
    [super dealloc];
}

Другими словами, когда managedObjectContext устанавливается кодом, как указано выше, или в tableView: didSelectRowAtIndexPath, тогда его необходимо освободить.

С другой стороны, если managedObjectContext не передается непосредственно в View Controller, и для установки управляемогоObjectContext используется следующий код ...

if (managedObjectContext_ == nil) {
        managedObjectContext_ = [(PractitionerAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }

... тогда managedObjectContext не должен быть освобожден.

Здесь гораздо более короткий ответ. /2810391/pochemu-mne-ne-nuzhno-osvobozhdat-managedobjectcontext-vo-vtorom-tableviewcontroller По-видимому, даже несмотря на то, что MOC выделен в контроллере вида, это не имеет никакого эффекта, поскольку MOC принадлежит AppDelegate.

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