05-IOSCore - 单例模式、KVO
单例模式
是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一
要素:
各个地方都能访问方法
+ 静态消息 只要导入类 就能访问
保持唯一
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的更多相关文章
- [转] 上级向的十个iOS面试问题
上级向的十个iOS面试问题 转自 http://onevcat.com/2013/04/ios-interview/ 不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术 ...
- Head First 设计模式 —— 05. 单例模式
全局变量的缺点 如果将对象赋值给一个全局变量,那么必须在程序一开始就创建好对象 P170 和 JVM 实现有关,有些 JVM 的实现是:在用到的时候才创建对象 思考题 Choc-O-Holic 公司使 ...
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- 【转】单例模式(Singleton)
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
- 【转】单例模式(singletion)
单例模式(Singleton) 原地址:http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html 首先来明确一个问题,那就是在某些情 ...
- iOS KVO概述
iOS KVO概述 面试中经常会被问到:什么是KVO?这个问题既然出现概率这么大,那么我们就来详细讲一讲到底什么是KVO.下次再有面试官问你的时候,你就可以娓娓道来,以彰显高逼格 概述 问:什么是KV ...
- (转)Singleton 单例模式(懒汉方式和饿汉方式)
原文地址:http://www.cnblogs.com/kkgreen/archive/2011/09/05/2166868.html 单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某 ...
- C++实现单例模式
昨天面试的时候,面试官让我用C++或Java实现一个单例模式. 因为设计模式是在12年的时候学习过这门课,而且当时觉得这门课很有意思,所以就把课本读了几遍,所以印象比较深刻,但是因为实际编程中很少注意 ...
随机推荐
- uva Stacks of Flapjacks
Stacks of Flapjacks 题目链接:Click Here~ 题目描写叙述: ...
- Ext JS学习第六天 Ext_window组件(三)
此文用来记录学习笔记: 今天再来一个例子巩固一下学习的window: –例2: 在window中添加子组件,并讲解常用查找组件的方式: •重点分析:该实例主要针对于组件的查找进行详细的讲解,在以后的应 ...
- java多线程之yield()方法详解
yiled()方法的作用是放弃当前CPU的资源,将资源让给其它线程,但放弃的时间不确定,有可能刚刚放弃,又马上获得了CPU时间片.下面看一个小例子,看一下具体效果. public stati ...
- photoshop使用注意事项
CMYK 与 RGB 任何网络图片都会以RGB模式显示图片: 数码图片以RGB模式被捕捉,因此应在RGB模式下编辑: 大部分工具和滤镜只能在RGB模式下使用: RGB模式和CMYK模式之间不能实现无损 ...
- CXF 开发 WebService
什么是CXF: Apache CXF = Celtix + Xfire 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker ...
- Android 屏幕尺寸知识
转自:http://www.zcool.com.cn/article/ZNjI3NDQ=.html 1.了解几个概念 (1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏 ...
- 基于Win7 Python2.7的Numpy安装包分享
Numpy-1.9.2安装包: http://pan.baidu.com/s/1i3WZRoT 下载后双击安装即可! 另外分享一个安装教程,mark一下慢慢看: http://blog.csdn.ne ...
- python学习之lambda匿名函数
1 Python支持运行时使用“lambda”建立匿名函数(anonymous functions that are not bound to a name). python "lambda ...
- Python之路:Python 函数
一.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装 二. 函数的定义和使用 def 函数名(参数): ... 函数体 ... 函数的定义主要有 ...
- Windows failed to start.界面下修复win8引导
首先要保证 系统本身是没有问题的 不是在装机的时候出现这种情况 那么可以按照以下方法来进行 首先要在另外一台电脑上将win8刻进u盘 启动时以u盘为第一启动项启动 进入win8装机界面 点击左下角的修 ...