Ошибка компиляции кода Objective-C

Вот он мой код. Это очень просто, но я не понимаю ошибки

#import <Foundation/Foundation.h>

@interface Car: NSObject

@property(nonatomic,retain) NSString *brand;
@property int year;

@end //Car Interface

#import "Car.h"

@implementation Car

@synthesize brand, year;

@end //Car Implementation

#import "Car.h"

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

    //Creo un nuovo oggetto
    Car *myCar = [[Car alloc] init];

    //Setto i parametri
    [myCar setBrand: @"BMW Z4"];

    NSLog (@"Inserisci data modello: ");
    scanf (" %i", &y); //E' buona norma lasciare uno spazio
    [myCar setYear: y];

    //Stampo a video i dati
    NSLog(@"Marca: %@ Anno: %i", [myCar brand], [myCar year]);

    return (0);
}

Вот ошибки, которые я получил:

car.m:5:1: error: ivar 'brand' used by '@synthesize' declaration must be an existing iva
car.m:5:1: error: ivar 'year' used by '@synthesize' declaration must be an existing ivar
car.m:7:1: warning: incomplete implementation of class 'Car' [enabled by default]
car.m:7:1: warning: method definition for '-setBrand:' not found [enabled by default]
car.m:7:1: warning: method definition for '-brand' not found [enabled by default]
car.m:7:1: warning: method definition for '-setYear:' not found [enabled by default]
car.m:7:1: warning: method definition for '-year' not found [enabled by default]

person Mazzy    schedule 01.08.2013    source источник
comment
Это почти тот же код, что и в вашем предыдущем вопросе > stackoverflow.com/questions/17996426/. Почему вы принимаете ответ, если он не работает для вас? - И, возможно, вам следует еще раз упомянуть, что вы используете GNUstep.   -  person Martin R    schedule 01.08.2013
comment
Да, это тот же код, но я решил предыдущую проблему, потому что у меня больше нет этой ошибки. Теперь проблема в другом.   -  person Mazzy    schedule 01.08.2013
comment
Это не про GNUstep. Я использую clang с GNUstep и отлично могу скомпилировать ваш код.   -  person Fred Frith-MacDonald    schedule 02.08.2013


Ответы (2)


вам нужно добавить свойства в интерфейс.

это

@interface Car {
    @protected
        NSString *brand;
        int year;
}


@property(nonatomic,retain) NSString *brand;
@property int year;

@end

вместо этого

@interface Car: NSObject

@property(nonatomic,retain) NSString *brand;
@property int year;

@end //Car Interface

должно работать - но я не пробовал.

person jowe    schedule 01.08.2013
comment
Сначала изучите разницу между иварами и свойствами. - person Kreiri; 01.08.2013
comment
Да, теперь это работает... но причина этого до сих пор не ясна. я пойду учиться - person Mazzy; 01.08.2013

Это прекрасно работает при копировании и вставке в новый проект инструмента командной строки на основе XCode Cocoa. Единственная разница в том, что я добавил ваш код в @autoreleasepool:

Мэйн.м

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

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

    @autoreleasepool {
        int y;
        
        //Creo un nuovo oggetto
        Car *myCar = [[Car alloc] init];
        
        //Setto i parametri
        [myCar setBrand: @"BMW Z4"];
        
        NSLog (@"Inserisci data modello: ");
        scanf (" %i", &y); //E' buona norma lasciare uno spazio
        [myCar setYear: y];
        
        //Stampo a video i dati
        NSLog(@"Marca: %@ Anno: %i", [myCar brand], [myCar year]);
    }
    return 0;
}

Ответ @Martin R. выше указывает, что вы используете GNUStep вместо XCode, поэтому вы можете добавить этот тег или обратиться за советом конкретно на форумы или чаты GNUStep.

person Josh Whittington    schedule 01.08.2013
comment
Согласно тому, что вы говорите, программирование в XCode полностью отличается от программирования в GNUstep, так что это настоящая причина - person Mazzy; 01.08.2013
comment
@Mazzy - Вы имеете в виду @autoreleasepool? Это всего лишь функция автоматического управления памятью Objective-C (насколько я понимаю), но да, XCode наверняка является собственной IDE. - person Josh Whittington; 02.08.2013
comment
Дело не в GNUstep, а в компиляторе. Проблема заключается в GCC или, возможно, в слишком старой версии clang. Не используйте GCC с Objective-C. Если вы знаете кого-нибудь из новичков, скажите им, что они должны (должны) использовать clang, а не gcc. Удалите GCC, если это никому не повредит. - person Fred Frith-MacDonald; 02.08.2013