回顾:
内存管理:
1.OC中的内存管理,保证堆内存被正确的释放
2.管理的范围:继承了NSObject的对象
3.引用计数器的概念
引用计数器是用来记录当前对象被引用了多少次,也就说有多人正在使用它。
当你要使用一个对象的时候,应该让该对象retain,引用计数器+1
当你不使用某个对象的时候,应该release(autorelease),引用计数器-1。
只有当“引用计数器”的值为0的时候,系统会自动调用dealloc方法,来回收内存空间。
dealloc方法,一方面是为了监控当前对象什么时候销毁;另一方面,当前对象之前拥有过其他对象的指针,必须在dealloc方法里release
[super dealloc];
4.黄金法则
5.自动释放池
协议
代理 【重点之重】【在iOS开发中一种非常重要的设计模式】
一 协议
1.1 什么是协议
协议就是要相互遵守的约定,规范,行为
1.2 OC中的协议
OC的协议,就是一组方法的列表,不需要自己实现,由遵守协议的对象来实现协议中规定的方法。
1.3 协议的使用步骤:
1)制定协议 ——》 2).遵守协议——》3).由遵守协议的对象去实现协议里的方法——>4).调用协议方法
比如:某公司的老板,需要招聘一批程序员来为他开发项目,那么,老板需要制定一份协议,协议里规定:需要程序员具备写代码,调bug,汇报工作的能力。。。
协议方法的修饰符:
@required //必须实现,默认
@optional //可实现,可不实现
1.5 OC是多继承吗?有什么办法,可以解决这个问题?
不是,是单继承。
OC中的协议,可以实现类似于多继承的功能。
OC中的类可以同时遵守多个协议
1.6 协议的作用:
1.规范接口,统一接口。让遵守这个协议的所有对象都必须实现一 些方法。
2.实现类似于C++的多继承的效果
3.开发中最常用的【代理设计模式】
1.7 协议和继承都能达到统一接口的目的
继承:子类继承父类,子类就拥有父类的方法(不需要再实现一遍),除非父类的方法不满足子类的需求,需要重写父类的方法,重写的方法名和父类的方法名一样,这样就达到了统一接口的目的。
协议: 协议是用来规范接口,统一接口,一旦一个类遵守了协议,那么必须实现协议中规定的方法,如果多个类遵守了同一个协议,那么这些类中的协议方法名一样,这样也达到了统一接口的目的。
1.8 协议的特点:
1)所有的协议都必须直接或者间接的遵守基协议<NSObject>
2) 一个协议可以被多个对象同时遵守
3) 一个对象可以遵守多个协议
4) 如果父类遵守了某个协议,那么子类也会继承下去,即子类也 遵守了某个协议
练习:
1.现在有多个类,一个是加法类,一个减法类,一个乘法类,一个除法类,需要实现一个类具备加,减,乘,除四个功能。
2.创建一个超人,让他既能飞,也能工作,还能敲代码。
1.8 指针的限定
见【Demo】-【2-指针的限定】
二 代理设计模式 【重点】
代理
是iOS中一种非常重要的设计模式,是通过协议去实现的。
代理:
A如果想 去做某一件事,但他自己不会做或者不想做,那么他就会委托B帮他做。
A委托B:A就是委托者
B就是A的代理人
例子:老板Boss想去看电影,老板需要买票,但是老板自己没有时间,委托职员去帮他买票(网络,现场排队,电话买?。。),老板只想知道票价是多少?还剩下多少张?
Boss:
@property( …) Staff *sta;
-(void)想看电影。{
[sta 买票。。。];
}
}
Staff:
-(void)买票;
A委托B A让B帮忙做事
A:委托者 1)制定协议
2)声明协议指针,指针所指向的对象必须是遵守了 该协议的对象 id<协议名> delegate;
3) A让代理人B去做事,即使用self. delegate 调用 协议方法
B:代理者 1)遵守A制定的协议
2)实现协议里规定方法(这样,认为B具备了帮A 做事的能力)
三 循环包含和循环引用
3.1 循环包含
A的头文件导入了B的头文件,同时B的头文件又导入了A的头文件,这样,在展开头文件的时候,就会无限循环展开,这个过程称为“循环包含”.
解决方案:
#import 只能解决头文件重复包含的问题,但解决不了头文件循环包含。
使用@class解决头文件循环包含的问题!
@class 表示的是一个类的前置声明(预声明)
@class Staff; 仅仅只告诉当前类,Staff是一个类而已,并没有导入Staff的头文件的内容,如果使用@class Staff以后,在.m文件里还需要使用到Staff的接口部分,需要在.m文件里导入#import“Staff.h”,只有真正导入了头文件,才能使用该类的相关方法。
【在一定意义上合理的正确的使用@class,其实可以提高编译性能,缩短编译时间】
【面试题】#import””,#import<>,#include,@class的区别
3.2 循环引用
A强持有B的指针,B又强持有A的指针,
A:
@propety(nonatomic,retain)B *b;
B:
@propety(nonatomic,retain)A *b;
见【Demo】-【4-循环引用】
//代理指针为什么使用assign去修饰
//目的:为了避免代理对象的相互持有,而造成内存泄露
内存管理:
1.OC中的内存管理,保证堆内存被正确的释放
2.管理的范围:继承了NSObject的对象
3.引用计数器的概念
引用计数器是用来记录当前对象被引用了多少次,也就说有多人正在使用它。
当你要使用一个对象的时候,应该让该对象retain,引用计数器+1
当你不使用某个对象的时候,应该release(autorelease),引用计数器-1。
只有当“引用计数器”的值为0的时候,系统会自动调用dealloc方法,来回收内存空间。
dealloc方法,一方面是为了监控当前对象什么时候销毁;另一方面,当前对象之前拥有过其他对象的指针,必须在dealloc方法里release
[super dealloc];
4.黄金法则
5.自动释放池
协议
代理 【重点之重】【在iOS开发中一种非常重要的设计模式】
一 协议
1.1 什么是协议
协议就是要相互遵守的约定,规范,行为
1.2 OC中的协议
OC的协议,就是一组方法的列表,不需要自己实现,由遵守协议的对象来实现协议中规定的方法。
1.3 协议的使用步骤:
1)制定协议 ——》 2).遵守协议——》3).由遵守协议的对象去实现协议里的方法——>4).调用协议方法
比如:某公司的老板,需要招聘一批程序员来为他开发项目,那么,老板需要制定一份协议,协议里规定:需要程序员具备写代码,调bug,汇报工作的能力。。。
协议方法的修饰符:
@required //必须实现,默认
@optional //可实现,可不实现
1.5 OC是多继承吗?有什么办法,可以解决这个问题?
不是,是单继承。
OC中的协议,可以实现类似于多继承的功能。
OC中的类可以同时遵守多个协议
1.6 协议的作用:
1.规范接口,统一接口。让遵守这个协议的所有对象都必须实现一 些方法。
2.实现类似于C++的多继承的效果
3.开发中最常用的【代理设计模式】
1.7 协议和继承都能达到统一接口的目的
继承:子类继承父类,子类就拥有父类的方法(不需要再实现一遍),除非父类的方法不满足子类的需求,需要重写父类的方法,重写的方法名和父类的方法名一样,这样就达到了统一接口的目的。
协议: 协议是用来规范接口,统一接口,一旦一个类遵守了协议,那么必须实现协议中规定的方法,如果多个类遵守了同一个协议,那么这些类中的协议方法名一样,这样也达到了统一接口的目的。
1.8 协议的特点:
1)所有的协议都必须直接或者间接的遵守基协议<NSObject>
2) 一个协议可以被多个对象同时遵守
3) 一个对象可以遵守多个协议
4) 如果父类遵守了某个协议,那么子类也会继承下去,即子类也 遵守了某个协议
练习:
1.现在有多个类,一个是加法类,一个减法类,一个乘法类,一个除法类,需要实现一个类具备加,减,乘,除四个功能。
2.创建一个超人,让他既能飞,也能工作,还能敲代码。
1.8 指针的限定
见【Demo】-【2-指针的限定】
二 代理设计模式 【重点】
代理
是iOS中一种非常重要的设计模式,是通过协议去实现的。
代理:
A如果想 去做某一件事,但他自己不会做或者不想做,那么他就会委托B帮他做。
A委托B:A就是委托者
B就是A的代理人
例子:老板Boss想去看电影,老板需要买票,但是老板自己没有时间,委托职员去帮他买票(网络,现场排队,电话买?。。),老板只想知道票价是多少?还剩下多少张?
Boss:
@property( …) Staff *sta;
-(void)想看电影。{
[sta 买票。。。];
}
}
Staff:
-(void)买票;
A委托B A让B帮忙做事
A:委托者 1)制定协议
2)声明协议指针,指针所指向的对象必须是遵守了 该协议的对象 id<协议名> delegate;
3) A让代理人B去做事,即使用self. delegate 调用 协议方法
B:代理者 1)遵守A制定的协议
2)实现协议里规定方法(这样,认为B具备了帮A 做事的能力)
三 循环包含和循环引用
3.1 循环包含
A的头文件导入了B的头文件,同时B的头文件又导入了A的头文件,这样,在展开头文件的时候,就会无限循环展开,这个过程称为“循环包含”.
解决方案:
#import 只能解决头文件重复包含的问题,但解决不了头文件循环包含。
使用@class解决头文件循环包含的问题!
@class 表示的是一个类的前置声明(预声明)
@class Staff; 仅仅只告诉当前类,Staff是一个类而已,并没有导入Staff的头文件的内容,如果使用@class Staff以后,在.m文件里还需要使用到Staff的接口部分,需要在.m文件里导入#import“Staff.h”,只有真正导入了头文件,才能使用该类的相关方法。
【在一定意义上合理的正确的使用@class,其实可以提高编译性能,缩短编译时间】
【面试题】#import””,#import<>,#include,@class的区别
3.2 循环引用
A强持有B的指针,B又强持有A的指针,
A:
@propety(nonatomic,retain)B *b;
B:
@propety(nonatomic,retain)A *b;
见【Demo】-【4-循环引用】
//代理指针为什么使用assign去修饰
//目的:为了避免代理对象的相互持有,而造成内存泄露