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、
相关文章推荐
- Objective-C学习笔记2:类、对象和方法
- Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法 课后题解析 3-7
- 【黑马程序员】Objective-C语言学习笔记之对象的创建、使用和方法调用(三)
- Objective-C学习笔记(十九)——对象方法和类方法的相互调用
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第三章 类,对象和方法
- 黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记
- Objective-C学习笔记(十九)——对象方法和类方法的相互调用
- Objective-C基础学习笔记(三)-面向对象的三大特性之封装-set方法-get方法-类方法与对象方法
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之03-类、对象和方法——黑马 IOS 技术博客
- 黑马程序员-面向对象的理解以及Objective-C方法和对象分配内存的学习笔记
- Objective-C学习笔记(四):OC之分类、类对象、description方法和SEL
- Objective-C学习笔记(三)-类,对象,方法
- Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用
- Objective-C学习笔记(二十)——成员变量对对象方法与类方法的可见性分析
- 黑马程序员-IOS学习笔记(四)类、对象和方法
- 学习笔记3_函数、方法与对象
- 31天重构学习笔记13. 提取方法对象
- iOS学习笔记-Objective-C-类和对象
- 【学习笔记06】java面向对象-main方法、单例设计模式