Изменился ли Objective C 2.0 настолько, что старый код больше не будет работать?Является ли Obj C Apple только на этом этапе? - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть и Стивен Кочан Программирование в 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?Вот в чем вопрос.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2011

Более старый код фактически компилируется с gcc MacOSX с предупреждением:

~$ gcc frac.m -framework Foundation
frac.m:43: warning: incomplete implementation of class ‘Fraction’
frac.m:43: warning: method definition for ‘-init’ not found

и выдает ошибку времени выполнения при запуске.Но это связано со временем выполнения Apple.Что вы ссылаетесь на Linux или Windows?

[добавлено] Как отмечено в комментариях, в версии 1 -init объявлен и вызван, но не реализован.Если вы закомментируете строку, где она объявлена, и строку, где она вызывается, она скомпилируется и запустится (в macosx с gcc):

~$ cc  frac1.m -l objc
~$ ./a.out 
The value is: 1/3
0 голосов
/ 27 февраля 2011

Основными классами и NSObject, как мне кажется, являются только Apple.

Это не правильно.

«NSObject» - это базовый класс для API-интерфейса OPENSTEP примерно в 1994 году, а позднее - в Cocoa. Вы бы использовали «Объект» только в том случае, если вам нужно было поддерживать системы pre-OPENSTEP NeXT, поэтому удивительно, что он будет использован в книге, опубликованной в 2003 году.

Для разработки OPENSTEP / GnuSTEP / Cocoa вы используете "NSObject".

0 голосов
/ 27 февраля 2011

Объект находится в одной библиотеке, NSObject - в библиотеке Apple и GNUStep.Дело не в том, чтобы изменить язык, чтобы он больше не был обратно совместимым, это вопрос использования другой библиотеки.

Язык изменился, но только путем добавления, а не удаления.Однако библиотеки изменились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...