#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 /…