一.要点摘录:
三.类
1.P137 合成存取方法
使用@property 就足够了,并不需 要使用@sythesize变量,注意,如果不使用@sythesize,编译器生成的实例变量会以下划线(_)字符作为名称第一个字符。
2.P141 不带参数名的方法
-(int) set: (int)n: (int)d;
这个方法的第二个参数无命名。此方法名为 set::。语句如下:
[newFraction set 1: 3];
此并非为良好的代码风格。
3.P146
局部变量初始化为 nil,实例变量、静态变量(使局部变量保留多次调用一个方法的值)初始值为0。
二.练手小程序
题目:分数加减及约分。
1.main.c 文件
#import <Foundation/Foundation.h>
#import "Fraction.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here....
Fraction *first=[Fraction new];
Fraction *second=[Fraction new];
Fraction *result=[Fraction new];
//[number setUp:5];
//[number setDown:6];
//number.up=5;
//number.down=6;
//圆点(自定义也可用)
//通常用于设置或取得实例变量的值一般不用于方法(代码规范)
// 不用 _
[first setTo:1 over:4];
[second setTo:1 over:2];
NSLog(@"第一个:");
[first print];
NSLog(@"第二个:");
[second print];
[first add: second];
// [first reduce];
result=[first add:second];
NSLog(@"总和");
[result print];
}
return 0;
}
2.接口文件
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int up,down;
- (void) setTo: (int)n over: (int)m; //具有多个参数的方法名
- (double) convertToNum;//判断分母是否为零
- (Fraction *) add: (Fraction*) first;//相加
- (void) reduce;//化简
- (void) print;//打印
//- (void) setUp:(int) n;
//- (void) setDown:(int) d;
//- (int) up;
//- (int) down;
@end
3.实现文件
#import "Fraction.h"
@implementation Fraction
//@synthesize up,down;
//为两个属性生成一对设值方法和取值方法
//有属性 x,则编译器自动实现一个取值方法 x 和一个设置方法 setX
- (void) setTo: (int)n over: (int)m //设置分子分母值
{
_up=n;
_down=m;
}
- (double) convertToNum //判断分母是否为0
{
if (_down!=0)
return(double) _up/_down;
else
return NAN; //这个 nan 是什么?
}
- (Fraction*) add: (Fraction*) Second //相加
{
Fraction *result=[Fraction new];
//a/b+c/d=((a*d)+(b*c))/(b*d)
result.up=_up*Second.down+_down*Second.up;
result.down=_down*Second.down;
// [self reduce]; //self 关键字
//指明对象是当前方法的接受者,即reduce消息取得了发给add:消息的接收者。
[result reduce];
return result;
}
- (void) reduce //约分
{
int u=_up; //此为局部变量
int d=_down;
int temp;
while (d!=0)
{
temp=u%d;
u=d;
d=temp;
}
_up /=u;
_down /=u;
}
- (void) print //打印
{
NSLog(@"%i/%i",_up,_down);
//若实现中未使用@synthesize
//则编译器生成的实例变量会以下划线作为其名称的第一个字符
}
/*
- (void) setUp:(int)n
{
up=n;
}
- (void) setDown:(int)d
{
down=d;
}
- (int) up
{
return up;
}
- (int) down
{
return down;
}
*/
@end
4.输出
第一个
1/4
第二个
1/2
总和
3/4
*注释部分是讲解及优化前的代码。
附:一天要写好几篇博客才能补上之前的了== ><。