面向对象
面向对象是一种解决问题或处理事情的思想. 可以将复杂的事情简单化,将程序开发者从执行者转化成了指挥者
面向对象编程的时候使用:1.找到对象(没有就创建对象) 2.使用对象实现我们的需求
特点: 1.面向过程重点是过程及行为,而面向对象重点在于对象及结果.
2.有需求时首先找对象.如果找不到对象则自己创建一个对象.
3.对象具有很强的复用性.
4.指挥者对对象本身执行过程不用关心,也不可控制.对象本身决定最终结果好坏.
5.一切事情都可以用面向对象来处理,万物皆对象.
类与对象
使用计算机语言就是不断的在描述现实生活中的事物,OC中描述事物通过类的形式体现,类是具体事物的抽象,是一个抽象概念.
而对象即是该类事物实实在在存在的个体.
分两大步骤:
一.类的声明->功能:做 成员变量(实例变量)(即属性) 和 方法(即行为)的声明
@interface Phone: NSObject{//大括号里面写属性
@public//表示这个属性能被外部访问
}
//方法的声明.不能在大括号里. 方法中的数据类型必须用小括号括起来
-(void) call;
@end
/*
定义类并创建对象
1.定义一个手机类,包含屏幕尺寸与电池容量的属性,具有打电话的行为.
2.并创建一个手机对象
3.给这个对象的屏幕尺寸与电池容量赋值,并调用打电话的方法.
*/
//类的名称遵循标识符的规则.类名首自母大写.
//NSObject:类必须继承它才具有创建对象的功能.
#import <Foundation/Foundation.h>
//类的声名
@interface Phone : NSObject{
//大括号里面写属性
@public //表示这个属性能被外部访问
float screen; //屏幕尺寸
int cell; //电池容量
}
//方法的声名. 注意:不能在大括号里面. 方法中的数据类型必须用小括号括起来
-(void) call; //声名一个打电话的方法
@end // 不能少的,必须有.
//类的实现:里面做类里面声名的方法的实现
@implementation Phone
-(void) call{
NSLog(@"屏幕尺寸为%f,电池容量为:%d的手机打电话了....",screen,cell);
}
@end
int main(){
//创建了一个对象,并取了一个名字p
Phone* p= [Phone new];
// 对象的属性没有赋值之前都是0.
// float fs=p->screen;
// int ic=p->cell;
//给成员变量赋值
p->screen=3.5f;
p->cell=1420;
float fs=p->screen;
int ic=p->cell;
NSLog(@"手机的屏幕尺寸是:%f, 手机的电池容量是:%d",fs,ic);
//调用对象的方法
//[p call];
Phone* p2= [Phone new];
NSLog(@"手机的屏幕尺寸是:%f, 手机的电池容量是:%d",p2->screen,p2->cell);
return 0;
}
OC的有参方法
两个要点:1.参数的类型用()括起来. 2.参数用:(冒号)分割. 一个参数对应一个:(冒号)
如:定义一个两数相加的方法
简化版:不建议,除非有特殊要求.
-(int) add:(int) a :(int) b{
return a+b;
}
标准版:OC的规范:参数前面要有说明
-(int) addOfNum1:(int) a Num2:(int) b{
return a+b;
}
注意:方法中除了方法类型符, 参数名和数据类型的部分统称为方法名
//有参的方法的使用
#import <Foundation/Foundation.h>
//定义一个计算器类,计算两个整数相加的值
@interface Calculator : NSObject
//简化版
-(int) add:(int) a :(int) b;
//标准版
-(int) addOfNum1:(int) a Num2:(int) b;
//addOfNum1://方法名
//Num2: //方法名
-(int) chengOfNum1:(int) a Num2:(int) b; //乘法
-(double) chuOfNum1:(int) a Num2:(int) b; //除法
@end
@implementation Calculator
-(int) add:(int) a :(int) b{
return a+b;
}
-(int) addOfNum1:(int) a Num2:(int) b{
return a+b;
}
-(int) chengOfNum1:(int) a Num2:(int) b{
return a*b;
}
-(double) chuOfNum1:(int) a Num2:(int) b{
return (double)a/b;
}
@end
int main(){
Calculator* c= [Calculator new];
int count= [c add:1:2]; //简化版调用这个对象的方法
NSLog(@"两个数相加的和是:%d",count);
//int count= [c addOfNum1:1 Num2:2]; //标准版本调用方法
//NSLog(@"两个数相加的和是:%d",count);
int value=[c chengOfNum1:4 Num2:5];
NSLog(@"两个数相乘的和是:%d",value);
double d=[c chuOfNum1:4 Num2:5];
NSLog(@"两个数相除的和是:%f",d);
return 0;
}
1.一个类中的属性可以是任何类型
2.类设计的原则,高内聚与低聚合.
高内聚:就是把有关联的属性要封装起来,成为一个单一的模块.
低耦合:就是一个类中各模块应该尽量独立.
3.一个对象可以没有变量名直接使用.这个对象就称为匿名对象.
如:[Person new]->age;//直接用对象获取属性,而不是对象的指针.
Person *p=[Person new]; //获取对象的指针,并用指针操用对象
p->name="judy";
[p printMe];
//调用属性--(没有意义的,用的极少). //匿名对象--无法复用,仅一次有效.
[Person new]->name="fred";
NSLog(@"姓名:%s",[Person new]->name);
//调用方法--当希望用一个对象的方法(仅此而已),不想用这个对象的其它操作时,就可以用匿名对象直接调用方法.一次有效.
[[Person new] printMe];
野指针:没有赋值的指针 (非全局指针)
全局指针被创建时默认赋值为0--空指针
类与对象的内存机制
1.属性(成员变量)是在对象里
2.方法是在类中.
3.对象与类都会在内存开辟空间.
同一个类的对象都含有这个类的一个isa指针.所有的对象都指向同一个类.
4.对象的指针调用方法时,实际是发了一个消息给对象,对象根据消息去找到isa指针指向的类中对应的方法去执行.
5.方法中如果调用属性,则是哪个对象的请求,就调用哪个对象的属性.