[ 单例、代理 & 通知 ]
PS:手写单例、代理方法实现 & 通知的简单使用!
[ 单例模式,代理设计模式,观察者模式! ]
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
-- GoF “四人帮”《Design Patterns: Elements of Reusable Object-Oriented Software》将设计模式提升到理论高度,并将之规范化。该书提出了种基本设计模式。时至今日,在可复用面向对象软件的发展过程中,新的设计模式仍然不断出现。
==========================
1、单例-sharedXxx
==========================
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
// 保证对象只被初始化一次
+ (instancetype)sharedXxxxTools { // GCD static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; }
自定义单例,不用多线程:
+(id)shareDefault { static id s; if(s==nil) { s=[[self alloc] init] } return s; }
PS:
// 1、保证对象只被分配一次内存空间,通过dispatch_once能够保证单例的分配和初始化是线程安全的
+ (instancetype)allocWithZone:(struct _NSZone *)zone { // 同上 }
// 2、当使用到 copy 时,调用。
// 如: NSMutableDictionary 的 key,会默认做一次 copy 操作
- (id)copyWithZone:(NSZone *)zone { return instance; }
==========================
2、代理-delegate/protocol
==========================
代理设计模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
模式结构:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
a. 定义协议、方法 & 属性
Person.h
@class Person; @protocol PersonDelegate <NSObject> - (void)personFightWithOthers:(Person *)person; @end @interface Person : NSObject @property (nonatomic, strong) id<PersonDelegate> delegate; - (void)fight; @end
b. 遵守协议,成为代理,实现方法
Person.m
- (void)fight { if ([self.delegate respondsToSelector:@selector(personFightWithOthers:)]) { [self.delegate teacherFightWithOthers:self]; } }
Student.m
@interface Student() <TeacherDelegate> @end - (void)personFightWithOthers:(Person *)person { NSLog(@"fight..."); }
==========================
3、通知-Notification
==========================
Key-Value Coding (KVC):即是指 NSKeyValueCoding
一个非正式的 Protocol,提供一种机制来间接访问对象的属性
Key-Value Observing (KVO) :监听对象的属性值变化
它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。每次指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。
观察者模式
什么时候使用观察者模式?
当你需要将改变通知所有的对象时,而你又不知道这些对象的具体类型,此时就可以使用观察者模式。 改变发生在同一个对象中,并在别的地方需要将相关的状态进行更新。
iOS中观察者模式的实现方法
在iOS中观察者模式的实现有三种方法:Notification、KVO以及标准方法。
================
// 添加观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextFieldTextDidChangeNotification object:nil];
// 移除观察者
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 发送监听
[[NSNotificationCenter defaultCenter] postNotificationName:UITextFieldTextDidChangeNotification object:@"----!!!!" userInfo:@{@"username": @"zhangsan"}];
本地通知:
-------
// 1.创建本地通知对象 UILocalNotification *note = [[UILocalNotification alloc] init]; // 注册通知时,指定需要传递的数据 note.userInfo = @{"}; // 2.注册通知 UIApplication *app = [UIApplication sharedApplication]; // 将通知添加到scheduledLocalNotifications数组中 [app scheduleLocalNotification:note];
-------
分享
《 Design Patterns: Elements of Reusable Object-Oriented Software 》 Gof设计模式下载:|--> Download
================
PS:
[ 每日一句 ]
“非淡泊无以明志,非宁静无以致远。”
[搜索网址]
新“Google”搜索引擎:http://www.glgoo.com/
================
|--> Copyright (c) 2015 Bing Ma.
|--> GitHub RUL: https://github.com/SpongeBob-GitHub
[ 单例、代理 & 通知 ]的更多相关文章
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...
- iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)
(一)属性传值 (二)代理(委托)传值 代理传值 适用于 反向传值 (从后往前传) 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewController)中 1.2 创建协议类型的 ...
- iOS传值方式:属性,代理,block,单例,通知
正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...
- 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,
首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...
- iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值
有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳 ...
- iOS 之单例,代理,通知,KVO,Block全能解析
//单例 //.h + (Instannce *)shareInstance; //.m static Instannce *instance = nil; @implementation Insta ...
- iOS常用设计模式:MVC、单例、代理、观察者。
MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...
- 四大传值详解:属性传值,单例传值,代理传值,block传值
一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...
- iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)
iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例) iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...
随机推荐
- iOS 辛格尔顿
单例模式: 为什么使用单例,单例模式的用途是什么?以下我们举一个样例来诠释一下 举个大家都熟知的样例--Windows任务管理器,如图,我们能够做一个这种尝试,在Windows的"任务栏&q ...
- shell 脚本运算符
1.数值 格式: test "num1" opr "num2" [ "num1" opr "num2" ] opr 取值 ...
- 【Java GUI】Java面板基础:JPanel
有两个面板,常见的面板(JPanel)和滚动面板(JScrollPane) Jpanel 面板是一种常见的容器,JPanel的作用是实现接口层次结构,面放入一些组件.也能够在上面绘画,将放有组件和有画 ...
- paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地 ...
- Android Studio如何引用jar包裹(不gradle)
这和eclipse最大的区别.与非常人的预期开始Android Studio我们很不高兴这一套. 它直接在地图上.首先通过File->Projcet structure打开project结构界面 ...
- Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号
原文:Chapter 1 Securing Your Server and Network(1):选择SQL Server运行账号 原文出处:http://blog.csdn.net/dba_huan ...
- hdu 4856 Tunnels(bfs+状态压缩)
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...
- JTextAreaDemo
问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成 ...
- 【Hibernate步步为营】--(一对多映射)之双向关联
上篇文章讨论了单向关联的一对多映射,在一的一端维护双向的关系这样的做法尽管能实现可是存在非常多缺陷,首先生成非常多多余的SQL语句,由于多的一端不维护关系,仅仅有一的一端维护,在进行操作时一的一端会发 ...
- BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...