OCday04
来源:互联网 发布:奚梦瑶失误 知乎 编辑:程序博客网 时间:2024/05/29 15:04
day04 分类、扩展、协议、单例、代理
一、知识点回顾
1.继承
1.OC中继承指的类和类之间的关系。
2.OC中继承指的单继承。语法上不支持多继承。
3.OC中继承都是公有继承(有且仅有公有继承)。
4.OC中得继承为什么都是单继承?
1.借鉴了 高级语言 java和 smalltalk都是单继承
2.为了避免多继承中出现的菱形继承(钻石继承)出现二义性。
*3.遵守了开放和封闭原则(类的设计)
5.为什么要使用继承?
1.继承可以实现复用。(98%复用)
2.继承是类的一种扩展机制。(子类必须高度相似父类)
6.单继承由那些缺点?
1.语法上只支持单继承,没有多继承。
2.使用单继承 要求父类的设计要非常了解。且子类的内容高度依靠父类。(子类必须和父类高度相似)
3.使用单继承时可以增大子类的空间。
FFFFFFFFFF
FFFFFFFFFF ------------>增大了子类的空间
SSSSSSSSSS
SSSSSSSSSS
7.初始化方法
-(id)init
{
self=[super init];
if(self)
{
//初始化子类部分
}
return self;
}
8.id类型 self类型 super类型
id类型 是一个泛型 表示OC中所有类型的对象。
是一个弱类型,还是一个隐式的指针类型。(不带*)
id类型 返回值 做参数 id类型的数组 id类型的变量
self类型 也是一个指针 表示的是指向当前对象的指针。
- 方法中 self表示的就是一个当前的对象。
用法:
1.初始化方法中 self=[super init];
2.self.属性 (set get)
3.self方法 [self setNo:200];
4.self调用类内的对象方法
-(void)f1
{
[self f2];
}
*5.self在+类 方法中的作用
表示的是当前类的类名 [self new];
super 表示的是超类、也叫父类、也叫基类
作用:出现在函数中,用来调用父类中的初始化方法
1.初始化方法中常见
*2.试图控制的生命周期
多态
1.什么是多态?
相同的函数名在不同的子类中表现出来的功能各不相同。
2.实现多态需要哪些条件?
1.有多态必有继承 多态是建立在继承的基础上。
2.才能拿一个父类的指针指向子类的对象。
3.OC中所有的方法(函数)都是虚函数,虚函数的特点
不看指针 看对象。
3.什么时候用多态?
1.就是一个类有多个子类的时候用多态。
2.使用多态可以少写很多的子类对象的指针。
人
男人类
女人类
动物
狗 Dog *dog
猫 Cat *cat
老虎
……
4.知道方法的重写(初始化方法)、重载(少)
5.知道runtime(运行时) 多态
id 实现的多态 是指编译器编译阶段不检查类型,在运行时,才需要匹配对象的数据类型。
二、单例
demo-4有具体例子 价值好几百
单例是一种常见的设计模式,要求类的对象只能创建一次。一次保持着唯一的一个对象的地址。
这样的类我们就称为单例类。
2.1作用
保存属性生成的私有的成员变量。保存私有变量的,如果你想在类外访问私有的数据 通过单例来访问。
第二个 做音乐播放器 使用或系统中默写功能都是单例。
2.2分类
1.MRC 手动引用计数中非完全单例
static 但单例类 *指针=nil;
+(单例类 *)shareInstace
{
if(!指针)
{
指针=[[单例类 alloc]init];
}
return self;
}
2.完全单例
需要重写NSObject类中所有关于内存管理的函数,释放 拷贝(深 浅)等函数。
3.ARC自动引用计数 线程安全的 单例类
通过GCD 和 单例类实现一个可以在多线程中使用的基于ARC的单例。
3.分类、类别、类目
分类是OC中一种特殊的语法,是类的一种动态的扩展机制。
提供的功能是在不知道类的源代码的情况下,对类可以进行扩展的一种机制。
1.分类又分两种
2.有名分类(有名类别)
所谓有名类别就是指给类的分类起一个名称
只能扩展类的方法,不能扩展类的成员。
扩展方法:
可以扩展一个 + 方法
可以扩展一个 - 方法
语法格式:
分类的声明部分:
Student +分类的名称.h
@interface Student(分类的名称)
//只能声明方法
+(Student *)createStudent;
-(void)showStudentAllInformation;
@end
分类的实现部分:
Student +分类的名称.m
@implementation Student(分类的名称)
+(Student *)createStudent
{
}
-(void)showStudentAllInformation
{
}
demo-5
2.匿名分类(匿名类别)类的扩展
匿名分类(类别)也叫类的扩展,用途比较广,开发中经常用到,现在你Xcode创建一个新的UI工程,自带一个匿名分
类,我们一般轻快下都称为是类扩展。
一般我们要扩展的.m文件中,通常用来扩展私有的属性或成员或函数(方法)
匿名分类(类别 类扩展)的作用
不但能够扩展成员变量 还能扩展方法和属性
匿名分类语法:
@interface 类名()
{
NSUInteger _age;
}
@end
@interface Student : NSObject
{
NSUInteger _age;
}
-(void)setAge:(NSUInteger)age;
-(NSUInteger)age;
@end
2.为什么要使用分类?
1.因为OC中的继承都是单继承,只有一个父类,不能多继承,一旦这个父类被占用,就没有其他的父类的名额。
2.可以使用分类,分类扩展类比较灵活。可以不借助继承关系就可以直接对类进行扩展。
3.分类可以起到分散接口(方法)的作用。
4.早起的OC版本中 OC中没有协议的概念,可以通过NSOBject这类的一个分类 使实现 非正式协议。
来实现OC中涉及迷失中的非正式协议的委托(代理)。实际有三种
3.面试题
1.OC中有没有私有的成员变量?
2.OC中有没有私有的方法?如果有 怎么实现?
3.类扩展和分类有什么区别?
4.私有的方法如何调用?
[self 类内]
5.私有的成员变量在类外如何访问?
单例
4.协议 @protocol
4.1什么是协议?
协议也叫正式协议。所谓正式协议是一种OC中特有的语法,通过@protocol声明协议,协议是一个公有的方法列表。
只有声明部分,没有实现部分。
4.2协议中的方法列表
1.可选的方法
2.必选飞方法
4.3为什么要使用协议
使用协议的好处
1.可以起到分散接口的作用,把协议中的方法分散到实现协议的类中去。
2.通过协议实现(接口的)多继承
3.使用协议实现协议委托 ——委托的设计模式
4.使用协议可以实现委托传值
5.使用协议能够让一个类更加具有通用性。
4.4怎么使用协议
1.使用正式协议
第一步:制定协议
协议名称的命名规范:协议的名称必须是 类名+协议名 或 类名+Delegate
@protocol 协议名称
//声明在协议中的方法。
@end
第二步:采纳协议 也叫遵守协议
@interface 类名:父类名 <协议的名称>
第三步:遵守协议的目的 是为了实现协议中的方法
1.凡是必须要实现的就必须得在遵守该协议的类中实现
2.凡是可选的方法 可以根据自己的实际情况选择性的来实现。
5.委托(代理) [有协议必有委托]
设计模式中的一种,委托是两个对象之间的关系。两个对象之间通讯的一种方式。
当一个对象 想做一件事却没有能力做,另一个对象恰好能做这件事,那么我们就可以委托另外一个由能力去做这件事的对象去做。
例子:挂失银行卡 中介找房 玩lol送女友
1.委托类——委托人的属性 id<遵守协议>delegate(代理人)
|
协议————>约束了 委托的事件
1.帮我打LOL WOW,赢了请你吃饭
2.队友特别给力再来一局
^
|
| 实现方法
2.被委托类(代理类 受托类) <遵守协议> ———> demo-9
作业:
1.熟练掌握 协议委托 (LOL 妈妈保姆的例子0必会)
2.掌握 类的扩展 和 分类 掌握私有方法调用 私有成员保存
3.掌握 协议
编程题:
1. 你委托 你的女朋友 给你买一瓶可乐。因为你正在看NBA。
2.你委托 你的老爸 去ICBC银行挂失你得银行卡。因为你在上
学。
3.你委托 链家地产 给你租房 1.三居室 2.能洗澡 3.能做饭 4.有
宽带 5.必须是女性邻居