Могу ли я назначить только что вставленный управляемый объект self?

#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 . Итак, то, что вы делали, не будет нарушено, хотя это потенциально сбивает с толку.