ios常用设计模式详解

为什么要了解设计模式呢?

设计模式是前辈们通过多年的编程经历总结出来的经验,以便于更高效合理地组织代码,快捷方便地解决某一类问题。

1、单例设计模式

单例模式是使用比较普遍叫简单地一种设计模式,它的原理是:始终返回一个单例,节约资源。如果要求某个类只有一个实例,那么,单例模式是最好的解决方法

在iOS SDK中,用到单例模式的类:
1、UIApplication的+shareApplication方法,返回当前app的一个单例。
2、NSFileManager的+defaultManager方法,返回一个NSFileManager的一个单例
3、NSBundle的mainBundle方法会返回一个NSBundle单例
4、NSNotificationCenter的+defaultCenter方法返回个NSNotificationCenter的单例
5、NSUserDefaults的+defaultUserDefaults会返回一个NSUserDefaults实例
ARC环境下
创建单例的代码:
 
声明一个static类型的userInfo对象,并将其指向nil。为什么用static修饰呢?是因为,sattic修饰后的对象,是在整个程序声明周期都存在,并且只声明一次。
使用@synchronized加线程锁,防止多个线程同时创建userInfo对象,创建多个对象,破坏单例的初衷。
非ARC环境下
为了确定实例的唯一性需要重写下面的方法:
+(id)allocWithZone:(NSZone)zone
+(id)copyWithZone:(NSZone)zone
+(id)retain
-(void)release
-(id)autorelease
-(NSUInteger)retainCount

2、MVC模式(model,view,controller)

model用于对数据的处理,比如从数据库里存取数据。例如他可能会用一些构件来处理数据库,被模型返回的数据库是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,模型的代码写一次就可以被多个视图重用,减少了代码的重用性。

View用于对视图的显示,用户能看到的界面

Controller用于把model和view联系起来。通常负责用户交互的部分,从view里读数据,控制用户的输入,把数据传给model,model进行更新,将更新的数据返回给用户,或者反映在视图上

使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,比如一批统计数据可以分别用柱状图、饼图来表示,C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。

3、目标行为模式(target- action

目标行为模式能让代码解耦合,使得代码之间的关联性降低。顾名思义taget是目标,是事件发生后方法执行的对象,action是方法,当某个事件发生之后,taget就执行这个方法。例如:给按钮的点击事件添加target-action那么taget就是按钮,action就是这个点击事件发生之后需要执行的方法。能添加事件的空间都需要继承Control无论是直接继承还是间接继承.



4、观察者模式

1 、通知(NSNotification)
通知有一个通知中心NSNotificationCenter。它相当于一个中介,观察者向通知中心注册通知,对象向通知中心发送通知,由通知中心广播通知,在通知中心注册了这种通知的观察者,都会被激发。通知允许开发者以解耦合的方式在两个对象之间进行通信

通知分为自定义通知和系统自带的通知。
自定义通知:

通过[NSNotificationCenter defaultCenter]获取一个NSNotificationCenter的单例

-addObserver:selector:name:object: 通过这个方法向通知中心注册通知。

注册监听者,该⽅方法第⼀一个参数为监听者,第⼆二个参数selector参数⽤用于指定监听者的监听⽅方法,第三个参数name指定通知名称,第四个参数object代表发送者对象(poster),如果object参数为nil,则代表⽤用于监听任何对象发出的通知 ,当name为nil时任意通知都能被该观察者监听。

-postNotificationName:object:对象发送通知,任何一个对象都可以发送通知该⽅方法第⼀一个参数指定通知名称,第⼆二个参数指定通知的object ,当object为nil时任何任何观察者都能接受到该通知

-removeObserver:name:object:删除监听者,删除对指定监听者(通过name参数指定)、指定通知的监听 

NSNotification只允许同一程序中的不同对象之间进行通信,不能跨越不同的应用


通过NSNotificationCenter可以让应⽤用内不同对象以松耦合的⽅方式进⾏行通信 ,NSNotificationCenter完全可以代替这种基于delegate的通信机制,这样A象与B对象可以完全解耦 


NSNotification代表Poster(请求者)与observer(监听者)之间的信息载体,该对象包含如下只读属性 :

name:该属性代表该通知的名称。在创建监听者时就是根据该名称进⾏行注册的 

object:该属性代表该通知传递的对象

userInfo:该属性是⼀一个NSDictionary,⽤用于携带通知的附加信息 

通知可以用于在两个对象之间进行传值。

系统自带的通知:

当应⽤用程序状态改变时,UIApplication会对外发送NSNotification

当键盘出现时,UIWindow会对外发送NSNotification

可以在苹果的帮助文档中找到各种系统的通知:


KVO(Key Value Observing)

kvo模式指当指定的对象的属性被修改后则对象就会接收到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会⾃自动通知相应的观察者。 

addObserver:forKeyPath:options:context: 

observeValueForKeyPath:ofObject:change:context:当被监听key路径对应的属性值发⽣生改变时,就会回调监听器⾃自⾝身的⽅方法(该⽅方法) 

removeObserver:forKeyPath:key路径删除指定的监听器


5、代理模

    通俗地来讲,当某一个对象不能确定把数据传给某一对象时或者当某一对对象持有数据,不能自己执行某些操作,需要代理代替它执行,那么这个时候就要用到代理。代理需要遵守协议,执行里面的方法。也可以通过代理来传值。

协议的声明:

1、声明协议

2、声明一个testDelegate属性,通过这个属性调用协议中的方法。

3、代理遵守这个协议,实现协议里面的方法。










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值