您的位置:首页 > 移动开发 > Objective-C

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

2011-10-11 16:38 417 查看

变更履历

版本:v1.0

介绍

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

方法的调用

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

[ClassOrInstance method];


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

CllassOrInstance.method;


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

[pool drain];

类的定义

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

// 分数类定义
#import <Foundation/Foundation.h>

// 接口部分

@interface Fraction : NSObject
{
// 分子
int numerator;
// 分母
int denominator;
}

-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;

@end

// 实现部分

@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 *fraction = [[Fraction alloc] init];

// set fraction to 1/3
[fraction setNumerator:1];
[fraction setDenominator:3];

NSLog(@"The instance of fraction is:%i", [fraction retainCount]);

NSLog(@"The value of fraction is:");
[fraction print];
[fraction release];

[pool drain];
return 0;
}


@interface 部分


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

@implementation 部分

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

program 部分

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

@interface

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

@interface NewClassName: ParentClassName
{
memberDeclarations;
}

methodDeclarations;
@end


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

NSObject

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

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

实例变量

int numerator;

int denominator;


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

类/实例方法

-(void) setNumerator: (int) n;


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

返回值

-(int) retrieveNumerator;


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

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

-(void) print;


方法参数

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

-(void) setNumerator:(int) n;
-(void) setDenominator:(int) d;


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



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

@implementation

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

@implementation NewClassName

methodDefinitions;

@end


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

@implementation Fraction: NSObject


Program 部分

// program section

int main(int argc, char *argv[] )
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

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

// set fraction to 1/3
[fraction setNumerator:1];
[fraction setDenominator:3];

NSLog(@"The instance of fraction is:%i", [fraction retainCount]);

NSLog(@"The value of fraction is:");
[fraction print];
[fraction release];

[pool drain];
return 0;
}


首先来看 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、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐