Не удалось вызвать указанный инициализатор для класса NSManagedObject "building" - PullRequest
3 голосов
/ 18 ноября 2011

В настоящее время я создаю свой NSXMLParser, где я передаю делегат соответствующему объекту.

Когда мой анализатор достигает элемента с именем "building", он инициализирует новое Building с этим кодом.

if ([elementName isEqualToString:@"building"]) 
{
    building = [[Building alloc] initWithAttributes:attributeDict parent:self children:nil parser:parser];
}

Я создал свой собственный инициализатор в классе Building, который является подклассом NSManagedObject. (Создан автоматически из Core Data).

Это выглядит так:

- (id)initWithParser:(NSXMLParser *)parser 
{
    if (self = [super init])
    {
        [parser setDelegate:self];
    }
    return self;
}

Но я получаю эту ошибку при запуске: «Не удалось вызвать назначенный инициализатор для класса NSManagedObject».

Класс Building должен продолжить синтаксический анализ тегов при сборке и создать граф объектов из XMLfile.

Другими словами, классу Building необходимо знать, как анализировать, заполнять переменные экземпляра, создавать сущность и сохранять ее в графе объектов (просто для понимания, это можно игнорировать)

Я сделал что-то не так?Я не могу создать свой собственный инициализатор?Может быть, я должен создать класс, который наследует от NSObject, и создать мой анализатор, а затем создать сущность обычным способом?

Извините за этот длинный пост.

1 Ответ

10 голосов
/ 18 ноября 2011

Просмотрите документацию для жизненного цикла объекта объектов NSManagedObject и их подклассов.Жизненный цикл отличается от обычных объектов типа NSObject, и вам необходимо понять его, если вы собираетесь работать с Core Data.

Назначенный инициализатор для NSManagedObjects - initWithEntity:insertIntoManagedObjectContext:, поэтому любой пользовательскийинициализатор, который вы реализуете, должен сначала вызвать этот метод. Однако , как говорится в документации, вы не поощряете переопределение этого метода.

Вместо этого выполните пользовательскую инициализацию в awakeFromInsert или awakeFromFetch.Чтобы создать новый экземпляр NSManagedObject, вы затем вызываете initWithEntity:insertIntoManagedObjectContext: или используете вспомогательный метод +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:].

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