无标题文章

单例模式

什么是单例模式

单例模式是一个类在系统中只有一个实例对象,通过全局的一个入口点对这个实例对象进行访问。

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

你可能感兴趣的:(无标题文章)