Изменение основных элементов данных приводит к сбою приложения - PullRequest
0 голосов
/ 13 октября 2010

У меня возникла другая проблема с приложением Iphone, которую я сам не могу решить. Я реализовал своего рода функциональность органайзера в своем последнем приложении. Там можно создавать встречи, которые отображаются в виде таблицы и сохраняются в CoreDataStore. Я использую 4 класса:

  • обзор, где отображаются встречи
  • представление с текстовыми полями для ввода значений для места и названия встречи (создание / редактирование представления)
  • представление с DatePicker для определения начальной и конечной даты
  • контроллер, который обрабатывает создание и удаление элементов, используя следующие методы:

код:

-(void)createAppointmentObjectWithDate:(NSDate *)
                  appointmentDate name:(NSString *)appointmentName 
                           description:(NSString *)appointmentDescription 
                                 eDate:(NSDate *)appointmentEndDate
{
    NSManagedObjectContext *managedObjectContext = [[CoreDataManager sharedManager] managedObjectContext];
    AppointmentObject *newAppointmentObject = [NSEntityDescription insertNewObjectForEntityForName:AppointmentObjectEntityName
                                                                            inManagedObjectContext:managedObjectContext];    
    newAppointmentObject.appointmentName = appointmentName;
    newAppointmentObject.appointmentDescription = appointmentDescription;
    newAppointmentObject.appointmentDate = [appointmentDate earlierDate:appointmentEndDate];
    newAppointmentObject.appointmentEndDate = [appointmentEndDate laterDate:appointmentDate];   
}

-(void)deleteAppointmentObject:(AppointmentObject *)appointmentObject triggeredByUser:(BOOL)byUser{
    NSManagedObjectContext *managedObjectContext = [[CoreDataManager sharedManager]   managedObjectContext];
    [managedObjectContext deleteObject:appointmentObject];
}

Но происходит всякая безумная штука, которая приводит к сбою моего приложения с сообщением "SICBART":

2010-10-13 17:35:04.630 didacta[109:307] Serious application error.  Exception was      caught during Core Data change processing. 
This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  
-[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x19f150 with userInfo (null)
2010-10-13 17:35:05.118 didacta[109:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer controllerWillChangeContent:]: unrecognized selector sent to instance 0x19f150'

при этом появляются ошибки:

  • создание новой встречи и нажатие кнопки «Готово» (должно вызвать создание и всплывающий обзор)
  • изменение встреч и нажатие кнопки «Готово» (следует отправить изменения и всплывающий обзор)
  • нажатие на встречу в обзоре (следует создать представление / редактировать представление и передать значения)
  • удаление элемента

иногда я даже могу удалить встречу, но затем порядок элементов в табличном представлении каким-то образом искажается, поэтому индекс табличного представления больше не указывает на индекс встречи.

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

Справа.

- [CALayer controllerWillChangeContent:]: нераспознанный селектор, отправленный на экземпляр 0x19f150 с userInfo (null)

Это ваша ошибка.У вас есть NSFetchedResultsController, делегатом которого является CALayer.Похоже, что исходный делегат был освобожден, а CALayer был выделен с использованием той же области памяти.Исправление состоит в том, чтобы найти нарушающее -dealloc и добавить что-то вроде self.myFetchedResultsController.delegate = nil; self.myFetchedResultsController = nil;, предполагая, что вы используете свойства.

Иногда вы можете помочь отладить подобные вещи, включив зомби (перейдите в Проект → Изменить текущий исполняемый файл илиИтак, выберите Environment, добавьте переменную окружения NSZombieEnabled и установите для нее значение «YES» или около того; снимите флажок, когда закончите отладку).Зомби вызывают исключение, когда сообщение отправляется освобожденному объекту.(Зомби по умолчанию не освобождаются, поэтому ваше приложение будет эффективно утечкой; не забудьте снять флажок!).

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

«нераспознанный селектор» звучит так, как будто ваша модель данных не содержит некоторые атрибуты сущностей, которые вы пытаетесь использовать. Например, возможно, вы пытаетесь установить атрибут объекта, который не существует.

Попробуйте создать точку останова на newAppointmentObject.appointmentName = appointmentName; и пройдитесь по ней, чтобы увидеть, в какой точке происходит ошибка.

...