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中观察者模式的实现有三种方法:NotificationKVO以及标准方法

================

// 添加观察者

[[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

[ 单例、代理 & 通知 ]的更多相关文章

  1. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

  2. iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)

    (一)属性传值 (二)代理(委托)传值 代理传值 适用于 反向传值 (从后往前传) 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewController)中 1.2 创建协议类型的 ...

  3. iOS传值方式:属性,代理,block,单例,通知

    正向传值均可,反向传值除属性传值不可,其余均可.下面简单介绍: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootViewControllers ...

  4. 页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,

    首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...

  5. iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值

    有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳 ...

  6. iOS 之单例,代理,通知,KVO,Block全能解析

    //单例 //.h + (Instannce *)shareInstance; //.m static Instannce *instance = nil; @implementation Insta ...

  7. iOS常用设计模式:MVC、单例、代理、观察者。

    MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...

  8. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  9. iOS页面间传值的方式 (Delegate/NSNotification/Block/NSUserDefault/单例)

    iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)   iOS页面间传值的方式(NSUserDefault/Delegate/NSN ...

随机推荐

  1. Chrome console(转)

    阅读目录 写在前面 谷歌控制台Elements面板 查看元素上绑定的事情 样式操作 总况 console.log console.info console.error console.warn con ...

  2. Codeforces Round #270(利用prim算法)

    D. Design Tutorial: Inverse the Problem time limit per test 2 seconds memory limit per test 256 mega ...

  3. UVa 11587 - Brick Game

    称号:背景:brick game有N块,给你一个整数的定数S,两个人轮流木: 的木块数是集合S中存在的随意数字.取走最后木块的人获胜.无法取则对方获胜. 题干:如今让你先取,给你一个你的结果序列串T, ...

  4. proxool数据库连接池配置

    proxool.xml构造 <?xml version="1.0" encoding="UTF-8"?> <something-else-en ...

  5. 系列五AnkhSvn

    原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...

  6. XCODE4.6创建我的第一次ios规划:hello

    对于非常多刚開始学习的人来说,肯定希望自己尝试不用傻瓜的"Single View Application"模板创建一个含有View的窗体.而是希望能从零開始,先建一个空的框架.然后 ...

  7. jquery php 百度搜索框智能提示效果

    这个程序是利用php+ajax+jquery 实现的一个仿baidu智能提示的效果,有须要的朋友能够下载測试哦. 代码例如以下 index.html文件,保保存成index.htm <!DOCT ...

  8. BZOJ 3589 动态树 树链拆分+纳入和排除定理

    标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...

  9. Android视频通话Java代码

      近期学习Android平台下跨平台音视频通信开发,尽管网上有非常多开源项目供我们參考学习.但音视频效果非常一般,还有非常多不稳定的因素,毕竟是开源嘛.在国内我找到了一个比較好音视频通信解决方式(百 ...

  10. 【Android开发经验】来,咱们自己写一个Android的IOC框架!

    到眼下位置.afinal开发框架也是用了好几个月了,还记得第一次使用凝视完毕控件的初始化和事件绑定的时候,当时的心情是多么的兴奋- -代码居然能够这样写!然后随着不断的学习,也慢慢的对IOC框架和注解 ...