objective-c - Objective C 2.0 是否发生了如此大的变化以至于旧代码将不再运行? Apple 目前只有 Obj C 吗?

标签 objective-c linux gcc

我有 Stephen Kochan 的 Programming in Objective C发表于 2003 年和 Programming in Objective-C 2.0 (2nd Edition) 2009 年出版。这两本都是很棒的书,我正在刷新我的 Obj C 技能。

在这两个版本中,都有“带有类的分数”程序的列表。第一版列出3.4,第二版列出3.2。

这里是第一版中的 list 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。该列表被转换为使用 OS X Foundation 类框架,而不是通用的 objc/Object.h 导入。

这里是第二版的 list 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 上编译,我并不觉得这非常令人惊讶。但是,如果在 Linux 或 Windows 上的最新版本的 GCC 上编译,旧版本代码将不再运行。

具体的运行时错误是未找到init方法,但Kochan书中指出,init方法不需要在从Object派生的类上定义。事实上,你不需要在 NSObject 上定义 -init -allocfree,但 gcc 4.2.1 警告说它们没有为 Object 定义。 我假设当 Kochan 出版他的第一本书时,这段代码可以成功编译和执行。我相信 Foundation 类和 NSObject 是 Apple 独有的。

我可以编译并运行 30 年前的 C 代码,但 7 年前的 Objective C 不再可用? Objective C 本质上是否已经成为 Apple 独有的语言,除了 Apple 独有的编译器和技术之外没有任何真正的支持?就是那个问题。

最佳答案

Object 在一个库中,NSObject 在 Apple 和 GNUStep 的库中。这不是语言更改为不再向后兼容的问题,而是使用不同的库的问题。

语言发生了变化,但只是添加,而不是删除。不过,库已经改变了。

关于objective-c - Objective C 2.0 是否发生了如此大的变化以至于旧代码将不再运行? Apple 目前只有 Obj C 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5130918/

相关文章:

c++ - Visual Studio : Global namespace takes precedence over local

c - 程序通过 valgrind memcheck 提前终止

objective-c - 在 NSImage 上绘制文本

ios - 无法从 willDisplayCell 方法访问单元格

ios - 如何根据文本标签长度动态设置表格单元格高度?

c - 如何使用C代码从文本文件中读取时间戳数据?

linux - 在cmd文件中传递变量并在linux中执行

linux - Qt 虚拟键盘,用于在 Linux 主机上运行的 Qt 应用程序

c - 定义全局变量,在 main 中得到不同的结果

objective-c - Xcode4 核心数据模型编辑器显示问题