单例模式

是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一

要素:

各个地方都能访问方法

+ 静态消息 只要导入类 就能访问

保持唯一

1.在静态消息内限制对象的创建

2.外部不要调用alloc

#import "MXSingleton.h"

staticMXSingleton * _instance;

@implementation MXSingleton

+(MXSingleton *)sharedInstance{

if (_instance == nil) {

_instance = [[MXSingletonalloc] init];

}

return_instance;

}

@end

单例模式下的共享数据

1.原因

因为 单例模式的对象只有一个

所以 在程序中任何位置创建都应该返回这个对象

因为 在程序中任何地方都可以访问

所以 这个返回的对象相当于在程序运行时共享

因为 这个返回的对象在程序中单例并且共享

所以 这个对象里面的属性可以作为共享数据

1) 能够让你在不同的vc之间传输数据

目的:降低vc之间的耦合度

2) 还能够在任何对象之间传送数据

3) 缺点

1. 你不够控制哪些对象不能修改/查询值

2. 你都不知道谁修改了 哪修改 怎么改 是修改/查询

修改的顺序很难确定

4) 注意:

1. 两个VC之间联系紧密 还使用以前的正向/反向传值

联系中导致中间对象无缘无故增加传输属性时

再改用单例模式传值

6. 其它应用

1. 系统应用

[NSNotificationCenter defaultCenter];

[UIApplication sharedApplication];

[NSUserDefaults standardDefault];

+     sharedXxxxx

+ defaultXxxxx

+ standardXxxxx

2. 单例模式数据共享做为模型层的数据中心

TRAppModel

@property (nonatomic, strong) NSMutableArray * contacts;

TRDataCenter

TRAppModel.h

#import <Foundation/Foundation.h>

#import "TRContact.h"

//DataCenter

@interface TRAppModel : NSObject

@property (nonatomic, strong) NSMutableArray * contacts;

//- (void) addContact:(TRContact *)contact;

- (void)save;

- (void)read;

+ (TRAppModel *) sharedInstance;

@end

TRAppModel.m

#import "TRAppModel.h"

#import "TRContact.h"

staticTRAppModel * _sharedInstance;

@implementation TRAppModel

- (id)init

{

self = [superinit];

if (self) {

self.contacts = [NSMutableArrayarray];

TRContact * contact = [[TRContactalloc] init];

contact.name = @"三丧";

contact.phoneNumber = @"911";

[self.contactsaddObject:contact];

}

returnself;

}

//- (void) addContact:(TRContact *)contact

//{

//    [self.contacts addObject:contact];

//    // 对文件进行追加写入

//}

// 对象 -> 文件

- (void)save

{

NSLog(@"%@",NSHomeDirectory());

// 使用字符串|    plist    归档都可以

// 我使用归档

NSMutableData *data = [NSMutableDatadata];

NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data];

[archiver encodeObject:self.contactsforKey:@"contact"];

[archiver finishEncoding];

NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"];

[[NSFileManagerdefaultManager] createFileAtPath:dataPath contents:data attributes:nil];

}

// 文件 -> 对象

- (void)read

{

// 反归档

NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"];

NSData *data = [NSDatadataWithContentsOfFile:dataPath];

NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];

NSArray *array = [unarchive decodeObjectForKey:@"contact"];

self.contacts = [array mutableCopy];

}

+ (TRAppModel *) sharedInstance

{

if(_sharedInstance == nil){

_sharedInstance = [[TRAppModelalloc] init];

}

return_sharedInstance;

}

@end

二、单例模式抽出模型层

1. 效果

1) 可以将数据统一放到模型层对象中

减少C层之间的交互

2) 可以针对模型层增加存储/读取的消息

专门负责保存/恢复

3) 可以将业务逻辑也抽到模型层中

三、 KVO

1. 什么是KVO

Key Value Observer    键值观察

2. 干什么的?

KVO

观察一个对象的属性的更改

3. 观察者设计模式

1) 什么是?

关注一个对象,当对象变动时,得到通知

MXViewController.m

#import "MXViewController.h"

#import "MXPerson.h"

@interfaceMXViewController ()

@property(nonatomic,strong) MXPerson *person;

- (IBAction)textFieldName:(UITextField *)sender;

- (IBAction)levelChanged:(UIStepper *)sender;

@property (weak, nonatomic) IBOutletUILabel *labelName;

@property (weak, nonatomic) IBOutletUILabel *labelLevel;

@property (weak, nonatomic) IBOutletUIProgressView *progressViewLabel;

@end

@implementation MXViewController

- (void)viewDidLoad

{

[superviewDidLoad];

self.person = [[MXPersonalloc] init];

}

-(void)viewWillAppear:(BOOL)animated{

// KVO 观察者模式  是对象观察对象里的属性是否有变化

// 开始观察如果有多个属性就需要写多个addObserver进行观察

[self.personaddObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNewcontext:NULL]; // forKey表示要观察的对象,new是表示一旦有新值变化了就会调用下面的方法

[self.personaddObserver:selfforKeyPath:@"level"options:NSKeyValueObservingOptionNewcontext:NULL];

}

// 一旦被观察的对象有变化就会调用此方法

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

if ([keyPath isEqualToString:@"name"]) {

self.labelName.text = self.person.name;

}elseif ([keyPath isEqualToString:@"level"]){

self.labelLevel.text = self.person.level;

self.progressViewLabel.progress = [self.person.levelfloatValue]/6;

}

}

// 撤销观察

-(void)viewWillDisappear:(BOOL)animated{

[superviewDidAppear:animated];

[self.personremoveObserver:selfforKeyPath:@"name"];

[self.personremoveObserver:selfforKeyPath:@"level"];

}

- (IBAction)textFieldName:(UITextField *)sender {

self.person.name = sender.text;

}

- (IBAction)levelChanged:(UIStepper *)sender {

self.person.level = [NSStringstringWithFormat:@"%f",sender.value];

}

@end

05-IOSCore - 单例模式、KVO的更多相关文章

  1. [转] 上级向的十个iOS面试问题

    上级向的十个iOS面试问题 转自 http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术 ...

  2. Head First 设计模式 —— 05. 单例模式

    全局变量的缺点 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象 P170 和 JVM 实现有关,有些 JVM 的实现是:在用到的时候才创建对象 思考题 Choc-O-Holic 公司使 ...

  3. python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05

    反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...

  4. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  5. 【转】单例模式(Singleton)

    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...

  6. 【转】单例模式(singletion)

    单例模式(Singleton) 原地址:http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html 首先来明确一个问题,那就是在某些情 ...

  7. iOS KVO概述

    iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KV ...

  8. (转)Singleton 单例模式(懒汉方式和饿汉方式)

    原文地址:http://www.cnblogs.com/kkgreen/archive/2011/09/05/2166868.html 单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某 ...

  9. C++实现单例模式

    昨天面试的时候,面试官让我用C++或Java实现一个单例模式. 因为设计模式是在12年的时候学习过这门课,而且当时觉得这门课很有意思,所以就把课本读了几遍,所以印象比较深刻,但是因为实际编程中很少注意 ...

随机推荐

  1. iOS圆盘转动引导图的简单实现

    最近更新的一批app,好多都采用了圆盘转动的效果,比如:百度音乐.当当,大概效果如下: 看看这个是怎么实现的吧. 一.视图元素布局 首先需要明确,这些视图元素是分布在一个圆周上的,通过滑动位置,以圆周 ...

  2. 【原】spring boot在整合项目依赖的问题

    最近要开发新的项目,就花了几天时间看了下spring boot的相关资料,然后做了一个demo,不得不说开发效率确实很快,几行注解就完成了事务,aop,数据库等相关配置:但由于先前习惯了spring ...

  3. Windows最常用的几个网络CMD命令总结

    Windows最常用的几个网络CMD命令总结 http://www.cnblogs.com/sbaicl/archive/2013/03/05/2944001.html 一.ping 主要是测试本机T ...

  4. 写一个兼容性比较好的拖拽DEMO

    写一个兼容性比较好的拖拽DEMO 查看Demo 思路 div盒子 鼠标按下事件onmousedown 鼠标移动事件onmousemove,获得鼠标的坐标,将div移动至鼠标的当前坐标 鼠标抬起事件om ...

  5. 瀑布流的三种实现方式(原生js+jquery+css3)

    前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写.最近闲来没事,就自己写个.大致思路理清楚,还是挺好实现的... 原生javascript版 ...

  6. Objective-C 链式编程思想

    链式编程思想 链式编程是什么 链式编程就是将调用多个方法用点语法连接起来,让代码更加简洁和可读性更高刚开始接触链式编程是Masonry,用起来真的非常爽 1 make.left.right.top.e ...

  7. GROUPING SETS、ROLLUP、CUBE

    大家对GROUP BY应该比较熟悉,如果你感觉自己并不完全理解GROUP BY,那么本文不适合你.还记得当初学习SQL的时候,总是理解不了GROUP BY的作用,经过好长时间才终于明白GROUP BY ...

  8. qt 操作word

    //修改doc QString filepath="e:\\aa.doc"; QAxWidget *word = new QAxWidget("Word.Applicat ...

  9. hibernate的配置 1

    hibernate 是一种ORM框架,是ORM框架中一个典范 ORM叫做对象关系映射 是面向对象语言和关系型数据库之间的映射关系 所以只有在面向对象语言或者关系型数据库没用的时候ORM才会消失 ORM ...

  10. Android Intent 解析之二

    服务端Intent运行过程: Sticky:这个类型的BroadCast表示某些Intent须要被保留,当新的应用起来后,须要关注这个消息,可是呢,又不须要启动这个应用来接收此消息,比方耳机插入等消息 ...