单例模式
什么是单例模式
单例模式是一个类在系统中只有一个实例对象,通过全局的一个入口点对这个实例对象进行访问。
IOS单例模式类有哪些,举例:
UIApplication
UIAccelerometer
NSUserDefaults
NSNotificationCenter.
IOS中单例模式的实现方法:
非ARC模式下,覆盖allocWithZone: ,copyWithZone: ,retain ,retainCount, release 线程安全需要用@synchronized互斥锁判断当前实例
ARC模式下需要配合GCD里的dispath_once方法确保这个类的实例只被实例化一次,并且该方法的线程是安全的,最终得到同一个实例对象。(推荐这种方法,比synchronized执行效率高)
观察者模式
什么是观察者
观者模式是一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
什么时候使用观察者模式
当你需要将通知所有的对象时,而你有不知道这些对象的具体类型,此时可以使用观察者模式改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新
IOS中观察者模式的实现方法(有三种)
Notification - NotificationCenter
KVO
标准方法
优化TableView
Cell重用原理
当滚动列表时,部分UITableViewCell会移出列表窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource检查这个对象池,如果对象池中有未使用的UITableViewCell,dataSource会用新的数据配置这个cell,重新显示到窗口中,从而避免创建新对象。如果显示5个cell只需要创建6个cell就够了
1、使用不透明视图。
2、不要重复创建不必要的table cell
3、减少视图的数目
一、UITableView的使用步骤
UITableview的使用就只有简单的三个步骤:
告诉一共有多少组数据方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
告诉每组一共有多少行方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
设置每组每行(cell)
方法:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
二、UITableView使用说明
多少组数据和显示多少行通常是和数据息息相关的,在开发中数据通常存储在plist文件中,需要以一定的方式加载到项目中(模型)
设置每组每行,说简单点就是设置tableview中得每个cell.
设置cell的步骤有三步:
1.创建一个cell(需要考虑性能,对cell进行循环利用,注意缓存处理方式)
2.为cell设置数据
3.返回一个cell
设置cell有三种方式:
1.使用系统提供的tableviewcell进行设置
2.通过xib自定义tableviewcell,适用于长相一致的,如团购展示界面
3.通过纯代码自定义tableviewcell,适用于有差距的,如表现为高度不一样,有的cell拥有某个属性,而有的cell中没有,如微博展示界面
三、自定义UITableViewCell
通过xib文件自定义一个view的步骤
1.新建一个xib文件,描述一个view的内部
2.新建一个自定义的类,自定义的类需要继承自系统自带的view,继承自哪个类,取决于xib跟对象的class
3.新建类的类型最好跟xib的文件名保持一致
4.将xib的控件和自定义类的.m文件进行连线
5.提供一个类的方法返回一个创建好的自定iview(屏蔽从xib加载的过程)
6.提供一个模型属性让外界传递模型数据
7.重写模型属性的setter方法,在这里讲模型数据展示到对应的子控件上面
通过代码方式自定义cell
1.新建⼀一个继承自UITableViewCell的类
2.重写initWithStyle:reuseIdentifier:方法 添加所有需要显示的子控件(不需要设置子控件的数据和frame, 子控件要添加到contentView中)
对子控件进行一次性的属性设置(有些属性只需要设置一次, 比如字体\固定的图片)
3.提供2个模型
数据模型: 存放文字数据\图片数据
frame模型: 存放数据模型\所有子控件的frame\cell的高度
4.cell拥有一个frame模型(不要直接拥有数据模型)
5.重写frame模型属性的setter方法: 在这个方法中设置子控件的显示数据和frame
6.frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一 次)
四、使用代理的步骤
1.先搞清楚谁是谁的代理(delegate)
2.定义代理协议,协议名称的命名规范:控件类名 + Delegate
3.定义代理方法
* 代理方法一般都定义为@optional
* 代理方法名都以控件名开头
* 代理方法至少有1个参数,将控件本身传递出去
4.设置代理(delegate)对象 (⽐比如myView.delegate = xxxx;)
代理对象遵守协议
代理对象实现协议里面该实现的方法
5.在恰当的时刻调⽤代理对象(delegate)的代理方法,通知代理发生了什么事情(在调⽤之前判断代理是否实现了该代理⽅方法)
Category(类别)和Extension(类扩展,延展,匿名类别)区别
Category(类别)Extension(类扩展,延展)
作用为没有源代码的类添加方法
格式定义一对.h和.m
使用Category需要注意
Category的方法不一定非要在@implementaion中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序会崩溃
Category理论上不能添加变量,但是可以使用@dynamic填补这种不足。
内存管理
Core Foundation对象的内存管理
CFRetain(对象)引用计数器加1
CFRelease(对象)引用计数器减1
ARC模式下,将Core Foundation 对象转换成Objective-C对象,需要告诉编译器如何调整,引入bridge关键字:
__bridge:只做类型转换,不修改相关对象的引用计数,原来的Core Foundation对象在不用时,需要调用CFRelease方法。
__bridge_retained: 类型转换后,将相关对象的引用计数加1,原来的Core Foundation对象不在用时,需要调用CFRelease方法。
__bridge_transfer:类型转换后,将该对象的引用计数交给ARC管理,Core Foundation对象在不用时,不再需要调用CFRelease方法。
Objective-C内存管理法则
自己生成的对象,自己持有
非自己生成的对象,自己也能持有
不需要自己持有的对象时释放
非自己持有的对象无法释放
Objective-C内存管理方法的作用
生成并持有的 new alloc copy mutableCopy等方法
持有对象 Retain
释放对象 Release
废弃对象 dealloc