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. 非对称加密算法RSA使用注意事项

    原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteg ...

  2. docker 真实---安装基本映像 (一)

    浸泡了几天的官方网站,正确docker有了更好的理解.准备着手建立一个公司的开发和测试环境,包含java.python. 环境介绍 首先说明一下我的环境 2物理server(以后简称为主机) 主机A配 ...

  3. org.eclipse.birt.report.data.oda.jdbc.JDBCException: Missing properties in Connection.open(Propertie

    首先查看project的web.xml档"BIRT_RESOURCE_PATH"属性的设置.此属性设置的是"用户资源存放路径.这些资源包含 library 文件,imag ...

  4. x264 - open gop and closed gop

    GOP - Group of picture(影像集团),它指的是两个I帧之间的距离. Reference(基准期).  它指的是两个P帧之间的距离. 简而言之, 跨参考gop的,变open gop: ...

  5. Android UI法宝发展Angrytools

    最近很多人问我,个人App开发商如何设计UI. 其实这是个人开发者最头疼,谁在搞技术,真的不能做的一切.不可能花大量的时间去切图,去做原型设计,去做美工. 当然,尽管我们设计不出那么复杂,静止的UI. ...

  6. android tips—NumberPicker,DataPicker,TimePicker样式改动

    在使用NumberPicker.DataPicker,TimePicker这几个控件时,非常easy出现例如以下这个界面 可是我们想要的却是以下图示的结果 改动Application.activity ...

  7. java 添加一个线程、创建响应的用户界面 。 演示示例代码

    javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章  部分的代码  夹21.2.11 thinking in java 4免费下载: ...

  8. 探索static——不需要能够使用该类实例?

    在一般情况下.需要使用一个上课时间.你必须先实例化类,它调用的能力.在编程过程中发现.有些类不能直接实例来使用,利用其场.法等等. 这时候.靠的就是static作用.static英文意思为" ...

  9. 【BZOJ3627】【JLOI2014】路径规划 分层图

    意甲冠军:要查找.有门户网站:http://www.lydsy.com/JudgeOnline/problem.php? id=3627 注意:点的等待时长示意图为: 非常清晰了吧?没事,不清晰就不清 ...

  10. MapReduce架构和算法(2)

    一个.combiner计划 每map它可能会产生大量的输出,combiner的作用是map输出端先做合并.reducer的数据量. combiner最基本是实现本地key的归并,combiner具有类 ...