我有 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
-alloc
或 free
,但 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/