У меня есть и Стивен Кочан Программирование в Objective C , опубликованное в 2003 году, и Программирование в Objective-C 2.0 (2-е издание) , опубликованное в 2009 году. Обе прекрасные книги, и яОбновление моих навыков в Obj C.
В обоих выпусках есть список для программы Fraction with Classes.Это список 3.4 в первом издании, список 3.2 во втором издании.
Вот список 3.4 из первого издания:
#import <stdio.h>
#import <objc/Object.h>
///Interface section
@interface Fraction: Object
{
int numerator;
int denominator;
}
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(id)init;
@end
//Implementation section
@implementation Fraction;
-(void) print
{
printf(" %i/%i", numerator, denominator);
}
-(void) setNumerator:(int)n
{
numerator=n;
}
-(void) setDenominator:(int)d
{
denominator=d;
}
-(int) numerator {
return numerator;
}
-(int) denominator {
return denominator;
}
@end //Implementation
// Program section
int main (int argc, const char * argv[])
{
Fraction *myFraction;
myFraction=[Fraction alloc];
myFraction=[Fraction init];
[myFraction setNumerator:1];
[myFraction setDenominator:3];
printf("The value is:");
[myFraction print];
printf("\n");
[myFraction free];
return 0;
}
Второе издание стало гораздо более Apple / OS Xориентированный.Вместо того, чтобы сосредоточиться на GCC, текст больше сосредоточен на xcode.Вместо общего импорта objc/Object.h
листинг был переведен для использования платформы классов OS X Foundation.
Вот список 3.4 из второго издания:
// program to work with fractions - class version
#import <Foundation/Foundation.h>
//---- @interface section ----
@interface Fraction: NSObject
{
int numerator;
int denominator;
}
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
@end
//----@implementation section ----
@implementation Fraction
-(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[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
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 print method
NSLog (@"The value of myFraction is:");
[myFraction print];
[myFraction release];
[pool drain];
return 0;
}
Конечно, более старая версия не компилируется на более новом XCODE, и я не нахожу это ужасно удивительным.Однако старый код более не запускается, если он скомпилирован в последних версиях GCC в Linux или Windows.
Конкретная ошибка времени выполнения - init method not found
, но в книге Кочана говорится, что метод init не нужно определять в классе, производном от Object
.На самом деле вам не нужно определять -init
-alloc
или free
для NSObject
, но gcc 4.2.1 предупреждает, что они не определены для Object.
Я предполагаю, что этот код может быть успешно скомпилирован и выполнен, когда Kochanвыпусти свою первую книгу.Я считаю, что базовые классы и NSObject - только Apple.
Я могу скомпилировать и запустить 30-летний код C, но 7-летний Objective C больше не используется?Действительно ли Objective C стал языком только для Apple без реальной поддержки, кроме компиляторов и технологий Apple?Вот в чем вопрос.