Как сделать селектор объекта подкласса из NSManagedObject видимым для компилятора, помимо объявления в интерфейсе в файле * .h?

#cocoa #core-data #selector #nsmanagedobject

#cocoa #core-data #селектор #nsmanagedobject

Вопрос:

Core Data, NSManagedObject,

Я получил исходный код для демонстрационного приложения из MacResearch.org с именем Molecular Core

Существует класс с именем Molecule. Это подкласс NSManagedObject. Когда я пытаюсь вызвать метод экземпляра в экземпляре Molecule, я получаю сообщение об ошибке «нераспознанный селектор», следующее за сообщением NSLog чуть ниже:

2011-04-04 20:41:44.778 Molecular Core[13766:903] symbol=Ag molecule= (сущность: Молекула; идентификатор: 0x1230b70 ; данные: {атомы = ( ); имя = «Новая молекула»; }) координаты[1]=2.500000


2011-04-04 20:41:45.917 Молекулярное ядро[13766:903] -[NSManagedObject addAtomWithPosition:andSymbol:]: нераспознанный селектор, отправленный в экземпляр 0x1234d00


ЭТО МОЙ ВОПРОС:

Молекула.h объявляет метод- addAtomWithPosition:andSymbol: идентично определению в Molecule.m. Почему системе не удается найти этот метод. Экземпляр Molecule, по-видимому, рассматривается исключительно как экземпляр его суперкласса NSManagedObject . Почему это?

Спасибо за чтение! Отметить

 //
//  Molecule.h
//  Molecular Core
#import <Foundation/Foundation.h>
@class Atom;

@interface Molecule : NSManagedObject {
@private

}
@property (readwrite, copy) NSString *name;

/// THIS SELECTOR/METHOD IS 'INVISIBLE' TO COMPILER   //////

-(id)addAtomWithPosition:(double *)position andSymbol:(NSString *)symbol;

/// THIS CLASS METHOD IS VISIBLE TO COMPILER'   //////

 (id)moleculeFromXYZString:(NSString *)xyzString withName:(NSString *)name 
        inManagedObjectContext:(NSManagedObjectContext *)context;

@end
/// end molecule.h  /////////////////

// begin molecule.m  /////////////
//
//  Molecule.m

#import "Molecule.h"
#import "Atom.h"
#import "Element.h"

@implementation Molecule
@dynamic  name;


-(id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

  return self;
}

    //// THIS CLASS METHOD RUNS     ////////////

     (id)moleculeFromXYZString:(NSString *)xyzString 
       withName:(NSString *)name inManagedObjectContext:(NSManagedObjectContext *)context 
    {

   Molecule *molecule;

   molecule = (Molecule*) [NSEntityDescription insertNewObjectForEntityForName:@"Molecule" 
            inManagedObjectContext:context];

   molecule.name = name;

   NSScanner *scanner = [NSScanner scannerWithString:(nil == xyzString ? @"" : xyzString)];

   [scanner setCharactersToBeSkipped:[NSCharacterSet whitespaceCharacterSet]];

   BOOL xyzLine = NO;

   BOOL firstLineFound = NO;

   NSCharacterSet *newlineSet;

   newlineSet = [NSCharacterSet characterSetWithCharactersInString:@"n"];

   while ( ![scanner isAtEnd] amp;amp; ( ( xyzLine amp;amp; firstLineFound ) || !firstLineFound ) ) 
    {

  NSString *line = nil;

  NSScanner *lineScanner;

  double coords[3];

  NSString *symbol;

  if ( ![scanner scanUpToCharactersFromSet:newlineSet intoString:amp;line] ) 
     line = @"";

  [scanner scanString:@"n" intoString:NULL];

  lineScanner = [NSScanner scannerWithString:line]; // Create scanner for scanning line content

  [lineScanner setCharactersToBeSkipped:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

  xyzLine = [lineScanner scanCharactersFromSet:[NSCharacterSet letterCharacterSet] intoString:amp;symbol] amp;amp;
     [lineScanner scanDouble:amp;(coords[0])] amp;amp; 
     [lineScanner scanDouble:amp;(coords[1])] amp;amp; 
     [lineScanner scanDouble:amp;(coords[2])];

  NSLog(@"symbol=%@nmolecule=%@ncoords[1]=%f",symbol,molecule,(coords[1]));

  if ( xyzLine ) {

   firstLineFound = YES;

     //// THIS IS THE CALL THAT FAILS       /////////////////////

         [((Molecule*)molecule) addAtomWithPosition:(double *)coords andSymbol:(NSString*)symbol];
       }
     }

  return molecule;
  }

    -(id)addAtomWithPosition:(double *)position andSymbol:(NSString *)symbol {

       Atom *atom = [NSEntityDescription insertNewObjectForEntityForName:@"Atom" 
                                              inManagedObjectContext:[self managedObjectContext]];

       Element *element = [Element elementWithSymbol:symbol inManagedObjectContext:[self  managedObjectContext]];

       atom.molecule = self;

       atom.element = element;

       atom.positionX = [NSNumber numberWithDouble:position[0]];

       atom.positionY = [NSNumber numberWithDouble:position[1]];

       atom.positionZ = [NSNumber numberWithDouble:position[2]];

       NSLog(@"positionY=%@",atom.positionY);

       return atom;
    }


-(void)dealloc
{
  [super dealloc];
}

@end
  

Ответ №1:

NSManagedObject не реагирует на селектор, но ваш подкласс Molecule of NSManagedObject реагирует. Вам нужно установить класс для объекта Molecule на класс Molecule в вашей базовой модели данных.

Комментарии:

1. Совершенно верно! Большое спасибо. forrst.com/posts /…