- 这篇教学 假设你已经有一些基本的 C 语言知识,包括 C 数据型别、什么是函式、什么是回传值、关于指针的知识以及基本的 C 语言内存管理。
- Objective-C,是 C 的 衍生语言,继承了所有 C 语言的特性。是有一些例外,但是它们不是继承于 C 的语言特性本身。
- nil:在 C/C++ 你 或许曾使用过 NULL,而在 Objective-C 中 则是 nil。不同之处是你可以传递讯息给 nil(例如 [nil message];),这是完全合法的,然而你却不能对 NULL 如法炮制。
- BOOL:C 没 有正式的布尔型别,而在 Objective-C 中也不是「真的」有。它是包含在 Foundation classes(基本类别 库)中(即 imp<wbr></wbr>ort NSObject.h;nil 也是包括在这个头文件内)。BOOL 在 Objective-C 中有两种型态:YES 或 NO, 而不是 TRUE 或 FALSE。
- #imp<wbr></wbr>ort vs #include:就如同你在 hello world 范例中看到的,我们使用了 #imp<wbr></wbr>ort。#imp<wbr></wbr>ort 由 gcc 编译程序支援。我并不建议使用 #include,#imp<wbr></wbr>ort 基本上跟 .h 档头尾的 #ifndef #define #endif 相同。许多程序员们都同意,使用这些东西这是十分愚蠢的。无论如何,使用 #imp<wbr></wbr>ort 就对了。这样不但可以避免麻烦,而且万一有一天 gcc 把它拿掉了,将会有足够的 Objective-C 程序员可以坚持保留它或是将它放回来。偷偷告诉你,Apple 在它们官方的程序代码中也使用了 #imp<wbr></wbr>ort。所以万一有一天这种事真的发生, 不难预料 Apple 将会提供一个支持 #imp<wbr></wbr>ort 的 gcc 分支版本。
- 在 Objective-C 中, method 及 message 这两个字是可以互换的。不过 messages 拥有特别的特性,一个 message 可以动态的转送给另一个对象。在 Objective-C 中,呼叫对象上的一个讯息并不一定表示对象真的会实作这个讯息,而是对象知道如何以某种方式去实作它,或是转送给知道如何实作的对象。
- 编译 hello world
- hello.m
§ #imp<wbr></wbr>ort <stdio.h>
§
§ int main( int argc, const char *argv[] ) {
§ printf( "hello world/n" );
§ return 0;
}
-
- 输出
hello world
- 在 Objective-C 中使用 #imp<wbr></wbr>ort 代替 #include
- Objective-C 的预设扩展名是 .m
优点与缺点
- 优点
- Cateogies
- Posing
- 动态识别
- 指标计算
- 弹性讯息传递
- 不是一个过度复杂的 C 衍生语言
- 可透过 Objective-C++ 与 C++ 结合
- 缺点
- 不支持命名 空间
- 不支持运算符多载(虽然这常常被视为一个优点,不过正确地使用运算符 多载可以降低程序代码复杂度)
- 语言里仍然有些讨厌的东西,不过不比 C++ 多。
- 创建 classes
- @interface
- Fraction.h
- @interface
§ #imp<wbr></wbr>ort <Foundation/NSObject.h>
§
§ @interface Fraction: NSObject {
§ int numerator;
§ int denominator;
§ }
§
§ -(void) print;
§ -(void) setNumerator: (int) d;
§ -(void) setDenominator: (int) d;
§ -(int) numerator;
§ -(int) denominator;
§ @end
-
-
- NSObject:NeXTStep Object 的缩写。因为它已经改名为 OpenStep,所以这在今天已经不是那么有意义了。
- 继承(inheritance) 以 Class: Parent 表示,就像上面的 Fraction: NSObject。
- 夹在 @interface Class: Parent { .... } 中的称为 instance variables。
- 没有设定访问权限(protected, public, private)时,预设的访问权限为 protected。设定权限的方式将在稍后说明。
- Instance methods 跟在成员变数(即 instance variables)后。格式为:scope (returnType) methodName: (parameter1Type) parameter1Name;
- scope 有class 或 instance 两 种。instance methods 以 - 开头,class level methods 以 + 开 头。
- Interface 以一个 @end 作 为结束。
- @implementation
- Fraction.m
-
§ #imp<wbr></wbr>ort "Fraction.h"
§ #imp<wbr></wbr>ort <stdio.h>
§
§ @implementation Fraction
§ -(void) print {
§ printf( "%i/%i", numerator, denominator );
§ }
§
§ -(void) setNumerator: (int) n {
§ numerator = n;
§ }
§
§ -(void) setDenominator: (int) d {
§ denominator = d;
§ }
§
§ -(int) denominator {
§ return denominator;
§ }
§
§ -(int) numerator {
§ return numerator;
§ }
@end
-
-
- Implementation 以 @implementation ClassName 开始,以 @end 结束。
- Implement 定义好的 methods 的方式,跟在 interface 中宣告时很近似。
-