背景
本文记录学习ObjectC过程中的心得,参照网易云课堂视频,职坐标,记录视频的练习代码,并将要点进行总结。其实很多视频教程都不错,之前看的M了个J老师。本文包含创建一个Person
类及Fraction
类,实现分数的加减乘除.
第一个简单的Person类
Person.h
//
// Person.h
// ObjectC Class学习
//
// Created by yanzi on 16/8/14.
// Copyright © 2016年 yanzi. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSInteger _age;
}
-(id)init;
-(id)initWithName:(NSString *)name AndAge:(NSInteger) age;
//setter方法
-(void)setName:(NSString *)name;
-(void)setAge:(NSInteger) age;
//getter方法
-(NSString *)name;
-(NSInteger)age;
-(void)print;
+(void)test;
@end
Person.m
//
// Person.m
// ObjectC Class学习
//
// Created by yanzi on 16/8/14.
// Copyright © 2016年 yanzi. All rights reserved.
//
#import "Person.h"
@implementation Person
-(id)init{
self = [super init];
if(self){
_name = @"李小龙";
_age = 29;
}
return self;
}
-(id)initWithName:(NSString *)name AndAge:(NSInteger)age{
self = [self init];
self->_age = age;
self->_name = name;
return self;
}
-(void)setName:(NSString *)name{
_name = name;
}
-(void)setAge:(NSInteger) age{
_age = age;
}
-(NSString *)name{
return _name;
}
-(NSInteger)age{
return _age;
}
- (void)print{
NSLog(@"name = %@, age = %li", _name, _age);
}
+(void)test{
Person *person = [[Person alloc]initWithName:@"大爷的" AndAge:100];
[person print];
}
@end
知识点总结(一)
- 在ObjectC里打印用
NSLog
,以@""
表示,其中的@表示这是一个对象; - OC里类的实例化,用
Person *p = [[Person alloc]init]
来表示,alloc是NSObject的方法,表示在堆内存 上申请一块内存放Person对象,然后要调用构造函数(通常以init开头),构造函数有且仅能调用一次。 - OC里的
id
类型类似C语言里的Void *
,指向任意对象; - 变量存储在栈内存,但是alloc出来的对象存储在堆内存里;
-
号表示实例方法,也就归这个类的实例所有,+
表示静态方法,归这个类所有,类似Java里的static关键字.- NSLog打印时,打印字符串用
%@
作占位符,%li
作打印int的占位符. - OC里函数名字后面是用冒号来分割参数的,Java/c++都是用括号,这个一不小心真是不大适应;
下面是分数器的例子,实现分数的加/减/乘/除/约分
Fraction.h
//
// Fraction.h
// ObjectC Class学习
//
// Created by yanzi on 16/8/14.
// Copyright © 2016年 yanzi. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
NSInteger _fenzi; //分子
NSInteger _fenmu; //分母
}
- (id)initWithFenzi:(NSInteger)fenzi andFenmu:(NSInteger)fenmu;
//setter
- (void)setFenzi:(NSInteger)fenzi;
- (void)setFenmu:(NSInteger)fenmu;
//getter
-(NSInteger)fenzi;
-(NSInteger)fenmu;
- (void)print;
-(void)addFrac:(Fraction*)frac; //加
-(void)subFrac:(Fraction*)frac; //减
-(void)mulFrac:(Fraction*)frac; //乘
-(void)divFrac:(Fraction*)frac; //除
-(void)reduce; //约分
@end
Fraction.m
//
// Fraction.m
// ObjectC Class学习
//
// Created by yanzi on 16/8/14.
// Copyright © 2016年 yanzi. All rights reserved.
//
#import "Fraction.h"
@implementation Fraction
- (id)initWithFenzi:(NSInteger)fenzi andFenmu:(NSInteger)fenmu{
self = [super init];
if(self){
_fenmu = fenmu;
_fenzi = fenzi;
}
return self;
}
- (void)setFenmu:(NSInteger)fenmu{
_fenmu = fenmu;
}
- (void)setFenzi:(NSInteger)fenzi{
_fenzi = fenzi;
}
- (NSInteger)fenzi{
return _fenzi;
}
- (NSInteger)fenmu{
return _fenmu;
}
- (void)print{
NSLog(@"%li / %li", _fenzi, _fenmu);
}
- (void)addFrac:(Fraction *)frac{
_fenzi = _fenzi * [frac fenmu] + _fenmu * [frac fenzi];
_fenmu = _fenmu * [frac fenmu];
}
- (void)subFrac:(Fraction *)frac{
_fenzi = _fenzi*[frac fenmu] - _fenmu * [frac fenzi];
_fenmu = _fenmu * [frac fenmu];
}
- (void)mulFrac:(Fraction *)frac{
_fenzi *= [frac fenzi];
_fenmu *= [frac fenmu];
}
- (void)divFrac:(Fraction *)frac{
_fenzi *= [frac fenmu];
_fenmu *= [frac fenzi];
}
- (void)reduce{
NSInteger a = _fenzi;
NSInteger b = _fenmu;
while(b){
NSInteger temp = a % b; //辗转相除法求余数, 如果a % b求余不为0,则a和b的最大公约数,等于b对temp的最大公约数
a = b;
b = temp;
}
//出上面while循环后a就是最大公约数
_fenzi /= a;
_fenmu /= a;
}
@end
main.m
//
// main.m
// ObjectC Class学习
//
// Created by yanzi on 16/8/14.
// Copyright © 2016年 yanzi. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
// Person *p = [[Person alloc]initWithName:@"yanzi" AndAge:12];
// [p print];
// [Person test];
Fraction* frac1 = [[Fraction alloc]initWithFenzi:2 andFenmu:3];
Fraction* frac2 = [[Fraction alloc]initWithFenzi:1 andFenmu:4];
[frac1 print];
// [frac1 addFrac:frac2]; // 加法测试
// [frac1 subFrac:frac2];//减法测试
// [frac1 mulFrac:frac2];//乘法测试
// [frac1 divFrac:frac2]; //除法测试
[frac1 mulFrac:frac2]; //约分测试
[frac1 reduce];
[frac1 print];
}
return 0;
}