Неразпознат селектор за създаване на клас

Уча Objective-C. На път съм да създам прост клас, но при компилиране, след очаквания резултат, получавам тези грешки.

2014-05-08 10:15:47.998 ClassCreation[978:903] This is a method call in the new object!
2014-05-08 10:15:48.007 ClassCreation[978:903] -[Employee setName:]: unrecognized selector sent to instance 0x10010c850
...
terminate called after throwing an instance of 'NSException'
(gdb) 

Тук е Employee.h

#import <Foundation/Foundation.h>
@interface Employee : NSObject

// properties
@property NSString *name;
@property NSDate *hireDate;
@property int employeeNumber;

-(void) someMethod;

@end

Ето го Служителят.м

#import "Employee.h"

@implementation Employee

// matching the method definition that is defined in the interface
-(void) someMethod {
NSLog(@"This is a method call in the new object!");
}

@end

Тук е основното.м

#import <Foundation/Foundation.h>
#import "Employee.h"

int main (int argc, const char * argv[])
{

@autoreleasepool {

    //  inside here, I instantiate a new object of my new employee class
    Employee *fred = [[Employee alloc] init];

    // call a method of our new object
    [fred someMethod];

    // change a property of new object
    [fred setName:@"Fred Smith"];

}
return 0;
}

Аз съм на 10.6.8 с Xcode 4.2


person Neuran    schedule 08.05.2014    source източник
comment
Мисля, че трябва да синтезирате вашите свойства, ако не сте на Xcode 4.4 или по-нова версия. Може ли някой да потвърди това? Благодаря.   -  person EmptyStack    schedule 08.05.2014
comment
Да, това е вярно. Мисля, че старият Xcode е по-добър, ако искате да научите Objective-C. Всички тези неща за автосинтезиране правят наистина лесно за начинаещите да смесват концепциите за iVars и свойства. С Xcode 4.2 няма автосинтез, така че получавате грешка и имате шанс да научите какво всъщност е свойство. Това е наистина важна стъпка, ако искате да станете професионалист.   -  person Michael    schedule 08.05.2014
comment
имаш ли предупреждение   -  person newacct    schedule 08.05.2014


Отговори (1)


С XCode 4.2 трябва да добавите реда

@synthesize name,hireDate,employeeNumber;

към вашия файл Employee.m след реда @implementation

Автоматичният синтез на свойства стана достъпен само с XCode 4.4 - http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html

Трябва да разгледате надграждането на вашата версия на XCode

person Paulw11    schedule 08.05.2014
comment
ако това е така, тогава той трябваше да получи предупреждение - person newacct; 08.05.2014
comment
Не, защото main.m включва Employee.h, който съдържа дефинициите на @property, така че компилаторът знае, че свойството съществува. Когато компилира main.m, той не разглежда Employee.m, така че не знае, че методите за настройка и получаване липсват. Тъй като обект c обвързва селектора по време на изпълнение, вие също не получавате грешка при свързване. - person Paulw11; 09.05.2014
comment
Говоря за при съставянето на Employee.m. - person newacct; 09.05.2014
comment
Тъй като Employee е просто обект за съхранение и няма методи в .m и няма препратка към свойствата, там може дори да не е имало предупреждение - нямам XCode 4.2 за проверка. Дори да е имало предупреждение, хората често пренебрегват предупрежденията (не трябва, но го правят). Предупреждението няма да спре изграждането и ще получите срива по време на изпълнение, който OP е преживял - person Paulw11; 09.05.2014
comment
Когато компилаторът за предварително автоматично синтезиране компилира @implementation и не съдържа метод за изпълнение, @synthesize или @dynamic за декларирано свойство, това ще бъде предупреждение. - person newacct; 09.05.2014
comment
Добре, но предупрежденията не пречат на кода да се компилира... просто получавате грешка по време на изпълнение - person Paulw11; 09.05.2014