Как/где объявлять переменные экземпляра в интерфейсе, реализации, формате программы для написания кода Objective-C?

Я использую Programming in Objective-C 4th edition Стивена Кочана, чтобы научиться Objective-C. Как новичок, я еще не понимаю, как отлаживать, и даже когда я копирую и вставляю код из книги в Xcode, я получаю ошибки. Это пример кода, который я получил из книги, который не будет компилироваться:

#import <Foundation/Foundation.h>
//---- @interface section ----
@interface Fraction: NSObject
-(void) print;
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d;
@end
//---- @implementation section ----
@implementation Fraction {
    int numerator;
    int denominator; 
}
-(void) print {
    NSLog (@"%i/%i", numerator, denominator);
}
-(void) setNumerator: (int) n {
    numerator = n; 
}
-(void) setDenominator: (int) d {
    denominator = d; 
}
@end
//---- program section ----
int main (int argc, char * argv[]) {
    @autoreleasepool { 
        Fraction *myFraction;
    // Create an instance of a Fraction
        myFraction = [Fraction alloc]; myFraction = [myFraction init];
    // Set fraction to 1/3
        [myFraction setNumerator: 1]; [myFraction setDenominator: 3];
    // Display the fraction using the print method
        NSLog (@"The value of myFraction is:");
        [myFraction print]; 
    }
    return 0; 
}

Ошибки, которые я получаю, - это «несогласованная спецификация переменной экземпляра» в строке 12. После этого он просто продолжает говорить мне, что «числитель» и «знаменатель» не объявлены. Последняя ошибка, которую я получаю для этой программы, заключается в том, что в «@autoreleasepool» есть «ожидаемое выражение перед токеном @». Что мне нужно изменить, чтобы он скомпилировался? Спасибо!!


person user2454440    schedule 05.06.2013    source источник
comment
какую версию xcode вы используете   -  person Kanhaiya Sharma    schedule 05.06.2013
comment
Я скопировал ваш код в проект Xcode 4.6.2, и он скомпилировался и запустился без каких-либо предупреждений.   -  person Martin R    schedule 05.06.2013


Ответы (3)


Я только что получил те же ошибки, используя GNStep. Измените объявление @interface и установите что-то вроде

@interface Fraction: NSObject {
    int numerator;
    int denominator; 
}

-(void) print;
-(void) setNumerator: (int) n; 
-(void) setDenominator: (int) d;
@end

Это сделало трюк и успешно скомпилировало программу для меня.

person Fidel Orozco    schedule 25.11.2014

Я предполагаю, что вы скопировали весь код в один файл. //---- @interface section ---- входит в файл Fraction .h, //---- @implementation section ---- — в Fraction .m, а остальное — содержимое файла main.m. Однако вам не следует изменять содержимое файла main.m.

person Levi    schedule 05.06.2013
comment
Не обязательно размещать интерфейс/реализацию в отдельных файлах .h/.m. На самом деле код, указанный в вопросе, компилируется и запускается (в Xcode 4.6.2) без каких-либо предупреждений или проблем. - person Martin R; 05.06.2013
comment
Хорошо, мой плохой тогда. Спасибо за внимание. - person Levi; 05.06.2013

@autoreleasepool — это новая функция, ваш компилятор кажется слишком старым. См. autoreleasepool не был объявлен в этой ошибке области.

person Polluks    schedule 03.11.2017