#objective-c #cocoa #core-data
#objective-c #какао #core-данные
Вопрос:
У меня есть следующий заводской метод. Мне просто интересно, если назначение
self = [NSEntityDescription insertNewObjectForEntityForName:entityName
inManagedObjectContext:[self managedObjectContext]];
правильно, учитывая тот факт, что мой класс является подклассом NSManagedObject
Спасибо
(CBItem *)insertEntityForName:(NSString*)entityName fromXMLElement:(NSXMLElement*)xmlElement withQueryType:(CBSearchQueryType)queryType inContext:(NSManagedObjectContext *)inContext
...
self = [NSEntityDescription insertNewObjectForEntityForName:entityName
inManagedObjectContext:[self managedObjectContext]];
...
return self;
Ответ №1:
Нет, это неверно. Вы назначаете только self
внутри init
метода. Для метода заводского типа вы должны возвращать переменную, например
CBItem* newItem = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:[self managedObjectContext]];
//Other stuff
return newItem;
Комментарии:
1. ОК. Что, если фабричный метод вызывается подклассом CBItem ? Должен ли я использовать приведение? (CBSubClassItem = [CBSubClassItem insertEntityForName:EntityName fromXMLElement:XmlElement]; )
2. Ну, возвращаемый класс в любом случае зависит от имени объекта, вы могли бы использовать
id
весь путь и присваивать только переменной правильного типа из вашей исходной вызывающей функции? Трудно сказать, не зная, чего вы пытаетесь достичь.3. Ну, я возвращаю суперкласс, и он работает. Я немного удивлен: я возвращаю класс и присваиваю возвращаемое значение подклассу.
4. insertNewObjectEtc возвращает экземпляр вашего подкласса. Затем вы присваиваете его переменной вашего базового класса и возвращаете его также как тип вашего базового класса. Затем вы присваиваете его переменной подкласса. Итак, от начала до конца экземпляр принадлежал подклассу, он просто был в более общей переменной. Objective C довольно слабо разрешает приведение к более конкретному типу.
5. @morningstar Я вижу! insertNewObjectEtc возвращает мой класс, вот почему. Я думаю, если бы я инициализировал базовый класс с помощью alloc] init] и вернул его, компилятор пожаловался бы.
Ответ №2:
self в методе класса (объявленном с вместо -) ссылается на объект класса. Хотя, однажды в любом методе, self похож на локальную переменную. Вы можете переназначить его на все, что захотите, если не ожидаете, что он будет продолжать действовать так, как обычно предполагается для self . Итак, то, что вы делали, не будет нарушено, хотя это потенциально сбивает с толку.