当前位置:   article > 正文

Objective-C 2.0 学习笔记二(类、对象和方法)_ios 2.0 创建对象方法

ios 2.0 创建对象方法

变更履历

版本:v1.0

介绍

这一章主要学习了如果在 OC 中创建一个类,并定义其实例变量及方法。如何创建并初始化一个类对象,如何调用这个对象的方法。

方法的调用

Objective-C 采用特殊方式的对类和实例应用方法:

[ClassOrInstance method];

这种方式有些特殊,让我们再来看看 Java 中是怎样的:

CllassOrInstance.method;

当你请求一个类或实例来完成某个动作(action)时,就是向它发送一条消息,消息的接收方(recipient)称为接受者(receiver)。因此,用另一种方式来看前面描述的一般格式,如下所示:

[pool drain];

类的定义

下面我们来看一个 OC 类是如何定义的

  1. // 分数类定义
  2. #import <Foundation/Foundation.h>
  3. // 接口部分
  4. @interface Fraction : NSObject
  5. {
  6. // 分子
  7. int numerator;
  8. // 分母
  9. int denominator;
  10. }
  11. -(void) print;
  12. -(void) setNumerator: (int) n;
  13. -(void) setDenominator: (int) d;
  14. @end
  15. // 实现部分
  16. @implementation Fraction
  17. -(void) print
  18. {
  19. NSLog(@"%i/%i", numerator, denominator);
  20. }
  21. -(void) setNumerator: (int) n
  22. {
  23. numerator = n;
  24. }
  25. -(void) setDenominator: (int) d
  26. {
  27. denominator = d;
  28. }
  29. @end
  30. // program section
  31. int main(int argc, char *argv[] )
  32. {
  33. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  34. Fraction *fraction = [[Fraction alloc] init];
  35. // set fraction to 1/3
  36. [fraction setNumerator:1];
  37. [fraction setDenominator:3];
  38. NSLog(@"The instance of fraction is:%i", [fraction retainCount]);
  39. NSLog(@"The value of fraction is:");
  40. [fraction print];
  41. [fraction release];
  42. [pool drain];
  43. return 0;
  44. }

@interface 部分

@interface 用于描述类、实例变量及方法定义。

@implementation 部分

@implementation 部分包含了实现这些方法的实际代码。

program 部分

这部分是实现程序预期目的的代码。

@interface

定义新类时,必须做一些事情。首先,定义类名,类命名规则与 Java 基本相同;第二,确定父类;第三,必须确定这个类对象要存储的数据的类型,也就是实例变量(实例变量是 OC 的叫法,在 C++ 中称他们为数据成员,Java 中叫属性,但你要知道,他们是一个东西);最后,还必须定义操作或方法的类型。这些工作都是在 @interface 的特殊部分完成的,该部分的一般格式如下所示:

  1. @interface NewClassName: ParentClassName
  2. {
  3. memberDeclarations;
  4. }
  5. methodDeclarations;
  6. @end

关于命名约定请参考《 Cocoa 编码指南》。

NSObject

一般意义上来说,我们编写的代码根类就是 NSObject,虽然它并不是 Cocoa 提供的唯一根类。关于 NSObject 的描述参见《TODO 链接站位》。目前我们只需要知道继承 NSObject 即可,NSObject 类在 NSObject.h 中定义,导入 Foundation.h 文件时会自动包含这个类,所以,别忘记导入它。

另外,OC 是单继承的,这点与 Java 没有什么不同。

实例变量

  1. int numerator;
  2. int denominator;

这里只是简单的定义了实例变量,并没有涉及到如作用域定义、静态变量定义等问题,这些问题在《 TODO 连接站位》有详细描述。OC 中实例变量默认的作用域是 @protected,也就是实例变量可以被该类及任何子类中定义的方法直接访问。

类/实例方法

-(void) setNumerator: (int) n;

开头的负号(-)通知 OC 编译器,这是一个实例方法。其它唯一的选择是正号(+),它表示类方法。在 Java 中一个类方法是通过增加 static 前缀来定义的,但 OC 不是,方法这里不能使用 static 关键字。

返回值

-(int) retrieveNumerator;

指定名为 retrieveNumerator 的实例方法将返回一个整数值。

void 用来定义方法没有返回值,形式如下:

-(void) print;

方法参数

上面的程序中定义了两个有参数的方法,如下所示:

  1. -(void) setNumerator:(int) n;
  2. -(void) setDenominator:(int) d;

每个方法有一个整型参数,通过参数名前面的(int)指明。详细说明如下所示:


在《第七章 类》中将学习到如何为方法指定多个参数。

@implementation

@implementation 部分包含了声明在 @interface 中方法定义的实现。一般格式如下:

  1. @implementation NewClassName
  2. methodDefinitions;
  3. @end

NewClassName 名称与 @interface 定义的类名一致。也可以使用冒号来明确继承的父类,如同 @interface 的一样:

@implementation Fraction: NSObject

Program 部分

  1. // program section
  2. int main(int argc, char *argv[] )
  3. {
  4. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  5. Fraction *fraction = [[Fraction alloc] init];
  6. // set fraction to 1/3
  7. [fraction setNumerator:1];
  8. [fraction setDenominator:3];
  9. NSLog(@"The instance of fraction is:%i", [fraction retainCount]);
  10. NSLog(@"The value of fraction is:");
  11. [fraction print];
  12. [fraction release];
  13. [pool drain];
  14. return 0;
  15. }

首先来看 Fraction 对象的创建

Fraction *fraction = [[Fraction alloc] init];

Fraction *fraction 定义了一个名为 fraction 的对象。星号(*)表示指针(或引用)。 [[Fraction alloc] init]; 这是一个方法的嵌套调用,首先执行的是 [Fraction alloc],alloc 是 allocate 的缩写,这个方法将会申请分配内存空间,并返回这个类的新的实例,《第八章》将会讨论这个主题;然后我们调用了 init 方法,这是一个实例方法,也是系统提供的,它将完成类中实例变量的初始化工作。init 方法也会返回一个值,即初始化的对象。

一般来说,OC 并不推荐方法的嵌套调用,这会降低代码的可读性,但上面的创建对象并初始化的过程是一个约定俗成的行为。

另外,还有一个名为 new 的方法,可以将 alloc 和 init 的操作结合起来,比如下面这样:

Fraction *fraction = [Fraction new];

除非你真的打算使用默认的方式来创建并初始化一个对象,否则 new 方法的用处并不大。

[fraction release];

这是一种释放 Fraction 对象使用内存的方式,内存管理又是一个大主题,具体可以参见 Apple 《 内存管理编程指南》中的描述。

对象的初始化

从上面的程序中我们并没有看到类似 Java 中的构造函数这种东西的存在,是不是 OC 就不支持构造函数呢?可以说是,也可以说不是。类似 C++ 或 Java 中约定的构造函数是不存在的,alloc 和 init 方法实际上从两个步骤完成了构造函数的功能,一般来说我们只需要写自己的 init 方法,就可以达到完成对象初始化的工作。init 方法从命名上并没有严格的限制,但一般都包含 init,如 initWithFormat 等。

参考

1、《Cocoa 编码指南》- Apple 中文文档

2、《内存管理编程指南》- Apple 中文文档

3、


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/43315
推荐阅读
相关标签
  

闽ICP备14008679号