赞
踩
版本:v1.0
这一章主要学习了如果在 OC 中创建一个类,并定义其实例变量及方法。如何创建并初始化一个类对象,如何调用这个对象的方法。
Objective-C 采用特殊方式的对类和实例应用方法:
[ClassOrInstance method];
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 用于描述类、实例变量及方法定义。
@implementation 部分
@implementation 部分包含了实现这些方法的实际代码。
program 部分
这部分是实现程序预期目的的代码。
定义新类时,必须做一些事情。首先,定义类名,类命名规则与 Java 基本相同;第二,确定父类;第三,必须确定这个类对象要存储的数据的类型,也就是实例变量(实例变量是 OC 的叫法,在 C++ 中称他们为数据成员,Java 中叫属性,但你要知道,他们是一个东西);最后,还必须定义操作或方法的类型。这些工作都是在 @interface 的特殊部分完成的,该部分的一般格式如下所示:
- @interface NewClassName: ParentClassName
- {
- memberDeclarations;
- }
-
- methodDeclarations;
- @end
NSObject
一般意义上来说,我们编写的代码根类就是 NSObject,虽然它并不是 Cocoa 提供的唯一根类。关于 NSObject 的描述参见《TODO 链接站位》。目前我们只需要知道继承 NSObject 即可,NSObject 类在 NSObject.h 中定义,导入 Foundation.h 文件时会自动包含这个类,所以,别忘记导入它。
另外,OC 是单继承的,这点与 Java 没有什么不同。
实例变量
- int numerator;
-
- int denominator;
类/实例方法
-(void) setNumerator: (int) n;
返回值
-(int) retrieveNumerator;
void 用来定义方法没有返回值,形式如下:
-(void) print;
上面的程序中定义了两个有参数的方法,如下所示:
- -(void) setNumerator:(int) n;
- -(void) setDenominator:(int) d;
在《第七章 类》中将学习到如何为方法指定多个参数。
@implementation 部分包含了声明在 @interface 中方法定义的实现。一般格式如下:
- @implementation NewClassName
-
- methodDefinitions;
-
- @end
@implementation Fraction: NSObject
- // 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 alloc] init];
一般来说,OC 并不推荐方法的嵌套调用,这会降低代码的可读性,但上面的创建对象并初始化的过程是一个约定俗成的行为。
另外,还有一个名为 new 的方法,可以将 alloc 和 init 的操作结合起来,比如下面这样:
Fraction *fraction = [Fraction new];
[fraction release];
从上面的程序中我们并没有看到类似 Java 中的构造函数这种东西的存在,是不是 OC 就不支持构造函数呢?可以说是,也可以说不是。类似 C++ 或 Java 中约定的构造函数是不存在的,alloc 和 init 方法实际上从两个步骤完成了构造函数的功能,一般来说我们只需要写自己的 init 方法,就可以达到完成对象初始化的工作。init 方法从命名上并没有严格的限制,但一般都包含 init,如 initWithFormat 等。
1、《Cocoa 编码指南》- Apple 中文文档
2、《内存管理编程指南》- Apple 中文文档
3、
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。