本章的学习笔记以本书第六章的例题(两个分数的加法)为主线展开,逐步介绍重要的知识点。
Part 1. 合成存取方法
从Objective-C 2.0 开始,可自动生成设置方法和取值方法:通过属性。
接口文件:
@interface Fraction : NSObject
@property int numerator, denominator; //分子,分母
实现文件:
@implementation Fraction
@synthesize numerator, denominator;//告诉编译器生成一对设置方法和取值方法。
通过
@property
指令,就不需要在实现部分生成相应的实例变量。如果有称为
x
的属性,那么在实现部分会导致编译器自动生成一个设值方法setX
和取值方法x
。
Part 2. 使用点运算符访问属性
设值方法
[myFraction setNumerator: 1];
[myFraction setDenominator: 3];
//等价于
myFraction.numerator = 1;
myFraction.denominator = 3;
Part 3. 局部变量
将一个分数约分的方法:
-(void) reduce
{
int u = numerator;
int v = denominator;
int temp;
//u,v,temp 局部变量
while (v!=0)
{
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
- 其他方法无法访问reduce方法的局部变量
- 默认初始化为nil,当方法返回的时候,变量的值都消失了;实例变量在多次方法调用时保持自己的值
Part 4. self 关键字
self关键字的用途:在方法内直接指明消息的接受者(是对象)。
-(void) add: (Fraction *) f
{
numerator = numerator * f.denominator + denominator * f.numerator;
denominator = denominator * f.denominator;
[self reduce]; //进行约分。 self 作为aFraction的引用,分数得到约简。(main函数中,计算对象 aFraction 和 bFraction的和,将结果直接约分)
}
Part 5. 将对象作为参数
- 方法声明:
//add:方法的参数是Fracion类对象的一个引用。当传递一个对象作为参数时,实际上是传递了一个数据存储位置的引用。
-(void) add: (Fraction *) f; //将分数与分数相加
- 方法展开:
-(void) add: (Fraction *) f
{
numerator = numerator * f.denominator + denominator * f.numerator;
denominator = denominator * f.denominator;
}
不能用这种方法直接指定参数f的实例变量。而是通过名字f标识这个对象,然后通过对f应用点运算符来获得实例变量。
Part 6. 将对象作为方法的返回值
在方法中创建新的分数(对象)来存储相加的结果并向消息的发送者返回新的Fraction
//返回一个对象。参数是对象。
-(Fraction *) add: (Fraction *) f
{
//创建新的对象存储相加后的结果
Fraction *result = [[Fraction alloc] init];
//对象result里面自动生成了numerator 和 denominator
result.numerator =numerator * f.denominator + denominator * f.numerator;
result.denominator = denominator * f.denominator;
[result reduce]; //对相加的结果约分
return result; //返回值
}