Неопознанный селектор создания класса

Я изучаю 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

Вот это Employee.m

#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-synchronous-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
Когда компилятор pre-auto-syntehsize компилирует @implementation и не содержит реализующего метода, @synthesize или @dynamic для объявленного свойства, это будет предупреждение. - person newacct; 09.05.2014
comment
Хорошо, но предупреждения не препятствуют компиляции кода... вы просто получаете ошибку времени выполнения - person Paulw11; 09.05.2014