单例模式
是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一
要素:
各个地方都能访问方法
+ 静态消息 只要导入类 就能访问
保持唯一
1.在静态消息内限制对象的创建
2.外部不要调用alloc
#import "MXSingleton.h" static MXSingleton * _instance; @implementation MXSingleton +(MXSingleton *)sharedInstance{ if (_instance == nil) { _instance = [[MXSingleton alloc] 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" static TRAppModel * _sharedInstance; @implementation TRAppModel - (id)init { self = [super init]; if (self) { self.contacts = [NSMutableArray array]; TRContact * contact = [[TRContact alloc] init]; contact.name = @"三丧"; contact.phoneNumber = @"911"; [self.contacts addObject:contact]; } return self; } //- (void) addContact:(TRContact *)contact //{ // [self.contacts addObject:contact]; // // 对文件进行追加写入 //} // 对象 -> 文件 - (void)save { NSLog(@"%@",NSHomeDirectory()); // 使用字符串| plist 归档 都可以 // 我使用归档 NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; [archiver encodeObject:self.contacts forKey:@"contact"]; [archiver finishEncoding]; NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"]; [[NSFileManager defaultManager] createFileAtPath:dataPath contents:data attributes:nil]; } // 文件 -> 对象 - (void)read { // 反归档 NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *dataPath = [documentsPath stringByAppendingPathComponent:@"data"]; NSData *data = [NSData dataWithContentsOfFile:dataPath]; NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; NSArray *array = [unarchive decodeObjectForKey:@"contact"]; self.contacts = [array mutableCopy]; } + (TRAppModel *) sharedInstance { if(_sharedInstance == nil){ _sharedInstance = [[TRAppModel alloc] 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" @interface MXViewController () @property(nonatomic,strong) MXPerson *person; - (IBAction)textFieldName:(UITextField *)sender; - (IBAction)levelChanged:(UIStepper *)sender; @property (weak, nonatomic) IBOutlet UILabel *labelName; @property (weak, nonatomic) IBOutlet UILabel *labelLevel; @property (weak, nonatomic) IBOutlet UIProgressView *progressViewLabel; @end @implementation MXViewController - (void)viewDidLoad { [super viewDidLoad]; self.person = [[MXPerson alloc] init]; } -(void)viewWillAppear:(BOOL)animated{ // KVO 观察者模式 是对象观察对象里的属性是否有变化 // 开始观察 如果有多个属性 就需要写多个addObserver进行观察 [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL]; // forKey表示要观察的对象,new是表示一旦有新值变化了 就会调用下面的方法 [self.person addObserver:self forKeyPath:@"level" options:NSKeyValueObservingOptionNew context:NULL]; } // 一旦被观察的对象有变化 就会调用此方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"name"]) { self.labelName.text = self.person.name; }else if ([keyPath isEqualToString:@"level"]){ self.labelLevel.text = self.person.level; self.progressViewLabel.progress = [self.person.level floatValue]/6; } } // 撤销观察 -(void)viewWillDisappear:(BOOL)animated{ [super viewDidAppear:animated]; [self.person removeObserver:self forKeyPath:@"name"]; [self.person removeObserver:self forKeyPath:@"level"]; } - (IBAction)textFieldName:(UITextField *)sender { self.person.name = sender.text; } - (IBAction)levelChanged:(UIStepper *)sender { self.person.level = [NSString stringWithFormat:@"%f",sender.value]; } @end
05-IOSCore - 单例模式、KVO,布布扣,bubuko.com
原文:http://www.cnblogs.com/yangmx/p/3583112.html