ios开发的设计模式,ios的设计特色

iOS 设计模式的应用 ④ 单例模式

在数学和逻辑学中,单例定义为” 有且仅有一个元素的集合 “,在无论什么情况下,获取到的都是同一个值。在程序中,单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。这个方法应该是类方法,阻止所有想要生成对象的访问,避免一个全局使用的类频繁地创建和销毁。

创新互联公司专注于波密网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供波密营销型网站建设,波密网站制作、波密网页设计、波密网站官网定制、成都微信小程序服务,打造波密网络公司原创品牌,更为您提供波密网站排名全网营销落地服务。

static uniqueInstance 是 Singleton 中的唯一实例, static sharedInstance 将它返回给客户端。通常, shareInstance 会检查 uniqueInstance 是否已经被实例化,如果没有,会生成一个实例然后返回 uniqueInstance 。

没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

只要应用程序需要集中式的类来协调其服务,这个类就应该生成单一的实例,而不是多个实例。

iOS常用设计模式

代理模式:完成委托方的任务,需要声明代理对象和指定代理,相对于block,在需要传递参数的传值时优先考虑代理。

代理是一对一的关系(1个对象只能通知1个对象发生了什么事)。

应用场景:不同类之间的传值与回调。

观察者模式(通知机制,KVO机制):观察者模式本质上是一种发布-订阅模型,用以消除具有不同行为的对象之间的耦合,通过这一模式,不同对象可以协同工作。

通知是一对多的关系(1个通知可以发送给多个通知接受对象)。

应用场景:监听设备状态,自定义键盘时监听键盘的弹出和隐藏。

单例模式:可以保证App在程序运行中,一个类只有唯一个实例。

系统中的单例:UIApplication(应用程序实例)、NSNotificationCenter(消息中心)、NSFileManager(文件管理)、NSUserDefaults(应用程序设置)、NSURLCache(请求缓存)等。

应用场景:功能集中管理的模块可以封装为单例,方便外界调用。

策略模式:定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

MVC(Model View Controller):

model:数据层

view:视图层,负责页面展示

Controller:控制视图层与数据层的关联,

MVVM(model view viewModel):

Model: 数据层,不包含逻辑

View:与用户直接交互,只需处理触发事件后的转发,和告诉他如何显示

ViewModel:跟踪view的事件,处理model层传递的数据;公开方法、属性,让view保持最新的状态

ios开发的设计模式有哪些

iOS开发就是为装有iOS系统的设备完成应用软件或游戏软件的开发,ios开发的设计模式有代理模式、观察者模式、MVC模式、单例模式、策略模式和工厂模式。

iOS 设计模式(一)-代理模式

代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。

协议:用来指定代理双方可以做什么,必须做什么。

委托对象:根据指定的协议,指定代理去完成什么功能。

代理对象:根据指定的协议,完成委托方需要实现的功能。

从上图中可以看到三方之间的关系,在实际应用中通过协议来规定代理双方的行为,协议中的内容一般都是方法列表,当然也可以定义属性。

协议是公共的定义,如果只是某个类使用,我们常做的就是写在某个类中。如果是多个类都是用同一个协议,建议创建一个Protocol文件,在这个文件中定义协议。遵循的协议可以被继承,例如我们常用的 UITableView ,由于继承自 UIScrollView 的缘故,所以也将 UIScrollViewDelegate 继承了过来,我们可以通过代理方法获取 UITableView 偏移量等状态参数。

协议只能定义公用的一套接口,类似于一个约束代理双方的作用。但不能提供具体的实现方法,实现方法需要代理对象去实现。协议可以继承其他协议,并且可以继承多个协议,在iOS中对象是不支持多继承的,而协议可以多继承。

协议有两个修饰符 @optional 和 @required ,创建一个协议如果没有声明,默认是 @required 状态的。这两个修饰符只是约定代理是否强制需要遵守协议,如果 @required 状态的方法代理没有遵守,会报一个黄色的警告,只是起一个约束的作用,没有其他功能。

无论是 @optional 还是 @required ,在委托方调用代理方法时都需要做一个判断,判断代理是否实现当前方法,否则会导致崩溃。

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。

通过上面这张图我们发现,其实委托方的代理属性本质上就是代理对象自身,设置委托代理就是代理属性指针指向代理对象,相当于代理对象只是在委托方中调用自己的方法,如果方法没有实现就会导致崩溃。从崩溃的信息上来看,就可以看出来是代理方没有实现协议中的方法导致的崩溃。

而协议只是一种语法,是声明委托方中的代理属性可以调用协议中声明的方法,而协议中方法的实现还是有代理方完成,而协议方和委托方都不知道代理方有没有完成,也不需要知道怎么完成。

由于代理对象使用强引用指针,引用创建的委托方对象,并且成为委托对象的代理。这就会导致委托对象的delegate属性强引用代理对象,导致循环引用的问题,最终两个对象都无法正常释放。

我们将委托对象的delegate属性,设置为弱引用属性。

weak 和 assign 是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后, weak 会自动将指针指向 nil ,而 assign 则不会。在iOS中,向 nil 发送消息时不会导致崩溃的,所以 assign 就会导致野指针的错误 unrecognized selector sent to instance 。

所以我们如果修饰代理属性,还是用 weak 修饰,比较安全。

网站名称:ios开发的设计模式,ios的设计特色
标题路径:https://www.cdcxhl.com/article44/dsdseee.html

成都网站建设公司_创新互联,为您提供建站公司面包屑导航响应式网站网站策划全网营销推广网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发