2011-05-11 14:06 佚名 otierney 字号: | 
Objective-C代码学习大纲(2)-LMLPHP

本文为台湾出版的《Objective-C学习大纲》的翻译文档,系统介绍了Objective-C代码,很多名词为台湾同胞特指词汇,在学习时仔细研读才能体会。

AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载!

创建classes

@interface

  1. Fraction.h
  2. #import
  3. @interface Fraction: NSObject {
  4. int numerator;
  5. int denominator;
  6. }
  7. -(void) print;
  8. -(void) setNumerator: (int) n;
  9. -(void) setDenominator: (int) d;
  10. -(int) numerator;
  11. -(int) denominator;
  12. @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

  1. Fraction.m
  2. #import "Fraction.h"
  3. #import
  4. @implementation Fraction
  5. -(void) print {
  6. printf( "%i/%i", numerator, denominator );
  7. }
  8. -(void) setNumerator: (int) n {
  9. nnumerator = n;
  10. }
  11. -(void) setDenominator: (int) d {
  12. ddenominator = d;
  13. }
  14. -(int) denominator {
  15. return denominator;
  16. }
  17. -(int) numerator {
  18. return numerator;
  19. }
  20. @end

Implementation 以 @implementation ClassName 开始,以 @end 结束。

Implement 定义好的 methods 的方式,跟在 interface 中宣告时很近似。

把它们凑在一起

  1. main.m
  2. #import
  3. #import "Fraction.h"
  4. int main( int argc, const char *argv[] ) {
  5. // create a new instance
  6. Fraction *frac = [[Fraction alloc] init];
  7. // set the values
  8. [frac setNumerator: 1];
  9. [frac setDenominator: 3];
  10. // print it
  11. printf( "The fraction is: " );
  12. [frac print];
  13. printf( "\n" );
  14. // free memory
  15. [frac release];
  16. return 0;
  17. }

output

  1. The fraction is: 1/3
  2. Fraction *frac = [[Fraction alloc] init];

这行程式码中有很多重要的东西。

在 Objective-C 中唿叫 methods 的方法是 [object method],就像 C++ 的 object->method()。

Objective-C 没有 value 型别。所以没有像 C++ 的 Fraction frac; frac.print(); 这类的东西。在 Objective-C 中完全使用指标来处理物件。

这行程式码实际上做了两件事: [Fraction alloc] 唿叫了 Fraction class 的 alloc method。这就像 malloc 记忆体,这个动作也做了一样的事情。

[object init] 是一个建构子(constructor)唿叫,负责初始化物件中的所有变数。它唿叫了 [Fraction alloc] 传回的 instance 上的 init method。这个动作非常普遍,所以通常以一行程式完成:Object *var = [[Object alloc] init];

[frac setNumerator: 1] 非常简单。它唿叫了 frac 上的 setNumerator method 并传入 1 为参数。

如同每个 C 的变体,Objective-C 也有一个用以释放记忆体的方式: release。它继承自 NSObject,这个 method 在之后会有详尽的解说。

05-11 22:52