OC教程9-开发模式

OC9-开发模式

本章内容主要讲述OC语言中常用的开发模式,开发模式是解决某些具体问题的固定解决方案。在OC中主要由三种可以使用

  • 单例模式
  • 键值观察模式
  • 消息模式

1,单例模式

在开发过程中,经常有一些共享型的数据需要储存在一个公共的地方,需要的时候,可以方便回去。单例模式便提供创建一个公共地方的方法。

@interface TestObj: NSObject

@property double a;

@end

例如我们声明上文中的一个对象,其中有一个a的属性可以存储数据。

TestObj * obj1 = [[TestObj alloc] init];
TestObj * obj2 = [[TestObj alloc] init];

obj1.a = 1;
obj2.a = 2;

上文中,通过两个对象指针访问a属性,是两块完全不同的内存空间,所有,两个对象储存的值也没有任何关联。但如果a是一个共享型的数据,那么在代码的任何地方获取的对象指针,应该都必须指向同一块内存,这样才能保证,通过任意对象指针获取的数据都是同一个数据。

解决以上问题,我们需要对类进行单例改造,添加一个单例方法,通过单例方法获取的对象指针都会指向全局唯一的内存。

@interface TestObj: NSObject

@property double a;

+(instancetype)shareTestObj;

@end

单例方法为加号方法,通常以share+类目的方式进行命名。

@implementation TestObj

+(instancetype)shareTestObj
{
    static TestObj * obj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        obj = [[TestObj alloc] init];
    });

    return obj;
}
@end

单例方法的实现也十分简单,首先声明一个静态对象指针,保证这个对象指针不会被释放。然后调用GCD中的只运行一次的方法,确保在任何情况下只会开辟一块内存空间,然后将对象指针的值返回。

TestObj * obj1 = [TestObj shareTestObj];
TestObj * obj2 = [TestObj shareTestObj];

经过处理的类具有单例方法,通过单例方法获取的对象指针所指向的内存为同一块内存,这样,在任何一个地方,只需要调用单例方法,便可以获取共享数据。

2,键值观察模式

OC中提供一个键值观察的机制,让我们可以主动观察某一个对象的属性变化情况。

NSObject类支持键值观察机制,所有其子类创建的对象也同时支持。使用兼职观察需要两步

  • 注册观察者与观察路径
  • 实现观察者回调

注册观察者与观察路径为NSObject提供的一个方法

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

这个方法需要被观察的对象调用,用来为自己添加其他观察者

方法参数

  • observer:添加的观察者对象,意思让该对象观察自己。
  • keyPath:观察属性名,例如想观察name属性,那输入@"name"即可
  • options:观察值的类型,分别可选初始值,新值和旧值。
  • context:回调上下文,因一个观察者可以观察多个对象,但回调方法都是这一个方法,所有可以通过这个参数类分辨是那个观察操作的回调。

当被观察对象的属性发生变化时,将会回调一个固定的方法,且此方法不需要被注册,默认生效

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

通过此回调方法,可以反馈到观察者如下信息

  • keyPath:被观察对象属性
  • object:被观察对象
  • change:改变内容
  • context:注册观察者时输入的上下文信息

下面通过一个完整的案例来展现一下键值观察的模式

@interface Student : NSObject

@property(strong, nonatomic) NSString * name;

@end
@interface Teacher : NSObject

@property(strong, nonatomic) Student * stu;

@end

@implementation Teacher

-(void)test
{
    self.stu = [[Student alloc] init];
    [self.stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

    self.stu.name = @"test";
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%@",change);
}

-(void)dealloc
{
    [self.stu removeObserver:self forKeyPath:@"name"];
}

@end
main()
{
    Teacher * tea = [[Teacher alloc] init];
    [tea test];
}

运行上述代码,即可看到输出结果,当stu对象的name属性发生改变是,键值观察回调方法变会被调用,同时输出change中的信息。

同时需要注意的是,在dealloc方法中移动要移除观察者,否则在对象是否之后,再产生的键值观察回调将会发送给一个野指针,产生概率性崩溃信息。

3,消息模式

消息模式是OC中较为特殊的一种开发模式,它为两个不能相见但有需要互通消息的对象提供了一个传递信息的机制。

通常我们在使用回调或者键值观察时,都需要直接获取要产生回调事件的组件对象或需要观察的对象。

但在一些特殊情况,例如之后的App开发课程中需要对键盘对象进行监控,但缺无法获取键盘对象,因键盘对象只在用户触发响应事件是才被创建。这样我们便可以采用消息的方式,接收键盘对象发出来的消息,从而实现对键盘对象行为的监控。

使用消息开发模式需要掌握一下三个步骤

  • 获取消息中心
  • 订阅消息
  • 取消订阅
  • 发送消息

获取消息中心:

NSNotificationCenter * center = [NSNotificationCenter defaultCenter];

消息中心对象需要通过单例模式获取,不能进行alloc操作,因为全局必须保证只有一个消息中心,才能够将消息正确的传递。

订阅消息:

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

该方法为消息中心对象的方法,其参数分别为

  • observer:接收消息回调的对象,类似目标动作回调中的target对象。
  • aSelector:消息到达时回调的方法,与目标动作回调中的action功能一致。
  • aName:订阅消息的名称,相当于筛选器,只接收指定名称的消息,如果为nil,则接收所有消息。
  • anObject:发送消息的对象

取消订阅:

- (void)removeObserver:(id)observer;

在dealloc方法中需要消息中心对象调用此方法取消订阅

发送消息分为两步,第一步是创建消息,第二步是发送消息

NSNotification * noti = [NSNotification notificationWithName:@"test" object:self userInfo:@{@"key":@"value"}];

创建一条消息需要三个参数

  • 消息名
  • 发送消息对象,通常填self
  • 消息携带的信息,为一个字典,其中键值对可自定义。
NSNotificationCenter * center = [NSNotificationCenter defaultCenter];

NSNotification * noti = [NSNotification notificationWithName:@"test" object:self userInfo:@{@"key":@"value"}];

[center postNotification:noti];

发送消息是消息中心的功能,调用相应的发送方法,即可把一个消息发送出去,如果在此之前,有对象订阅了相同名称的消息,那么该对象的消息回调方法会被调用。

时间: 2024-12-16 05:31:20

OC教程9-开发模式的相关文章

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进

微信公众帐号开发教程第3篇-开发模式启用及接口配置

编辑模式与开发模式 微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在"高级功能"里进行配置,点击"高级功能",将看到如下界面: 从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启.那两种模式有什么区别呢?作为开发人员到底要开启哪一种呢?编辑模式:主要针对非编程人员及信息发布类公众帐号使用.开启该模式后,可以方便地通过界面配置"自定义菜单"和"自动回复的消息".

微信公众平台开发模式详解图文教程

这部分主要讲解微信公众平台的开发模式,首先说明一下我不是程序员,所以本篇并非讲编程代码之类的,但是由于我们正在开发微信POP营销系统,所以我对开发模式有一定了解,这些了解应该会对准备尝试做微信开发的朋友会有一定帮助,少走部分弯路吧.如果对本篇教程有任何疑问或错漏之处欢迎留言或直接联系我进行更正修改. 微信公众平台开发模式 首先我们要明确开发模式什么可以做,什么不可以做: 一.开发模式可以实现的功能 可以接收用户发送过来的消息,通过你自己开发的系统把对应内容反馈回去.可以接收用户发送过来的地理位置

微信公众号教程(8)用微信开发模式做欢迎词

第九章 用微信开发模式做欢迎词 今天的重点是如何将微信开发模式和SAE对接,希望朋友们已经完成了SAE注册,如果还没搞定的话请抓紧,有问题的话请及时提出,接下来的教程都在那上面进行. 在教程开始前建议朋友们可以先注册一个新的公众账号,或者用非主账号当做开发测试账号,因为开发调试过称中可能会经常出现账号无法正常回复用户的情况,影响正常使用,所以在学习期间以及后期开发过程中最好有一个测试公众账号,等开发完成了再切换到主账号上,也是非常方便的. 一.微信公众平台与SAE对接通讯   我们先回到微信公众

OC教程5-委托delegate模式回调

OC5-委托模式回调 本章主要讲解委托模式已经通过委托模式实现的回调接口. 1,委托模式 委托模式是OC语法独有的开发模式.是基于组件拼装的一种快速开发模式.该模式下,可以保证组件的高度灵活性和通用性.属于组件的一种开放式接口. 下面通过一个现实生活中的场景简单理解下委托模式的应用. 例如我们现在有一个公司.公司想要进行IPO.可是公司老总并不熟悉资本操作,这时候就需要委托一个人或者一个机构来作这件事. 公司首先要提出能做IPO这件事的详细要求,然后在通过猎头寻找合适的人选. 用代码描述应该是这

微信公众号开发模式开启总结

一直没想过要开个微信公众号,想到经营公众号估计跟经营微博一样,像我这种素质的,肯定没有这种基因. 师兄推荐了一个学经济的妹纸过来请教我微信公众号开发者模式如何开启,妹纸请教,那必须上刀山下火海哇. 稍作研究了一下,其实并不复杂,妹纸被卡到的地方是输入URL和Token的地方,其实这个URL和Token想明白了还是很容易理解的.微信的开发者模式的意义在于,当订阅者通过菜单栏或者发送消息等方式向公众号发送请求的时候,请求会首先到达微信服务器,然后微信服务器需要把这个请求再转发给开发者自己的网站服务器

浅谈一下关于ios开发中一些简单地开发模式

最近公司的工作还比较轻松,自己想去写一些东西,因为本人是做ios开发的,能够希望在这个行业能够结交更多地朋友,下面是本人对一些常用的开发模式,小例子都是去采用的OC语言,希望大家能够提出观点,咱们多多去交流. 下面这个小案例就是简单工厂模式: 简单工厂模式: (1)计算器小例子 ######### // 计算器的类 #import <Foundation/Foundation.h> @interface Calutor : NSObject { float _num1; float _num2

webpack+react+redux+es6开发模式

一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入门教程   redux middleware 详解   Redux研究 React 入门实例教程 webpack学习demo NPM 使用介绍 三.工程搭建 之前有写过 webpack+react+es6开发模式 ,文章里介绍了一些简单的配置,欢迎访问. 1.可以npm init, 创建一个新的工程

OC中的代理模式

OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的.这里举一个简单的例子:小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play这里代理对象就是:护士类.保姆类,小孩类是被代理对象.看一下代码:首先看一下小孩类:Children.h[objc]  view plaincopy 1. //   2. //  Children.h   3. //  12_DesignStyle   4. //   5. //