单例模式设计模式
是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持惟一app
要素:atom
各个地方都能访问方法spa
+ 静态消息 只要导入类 就能访问设计
保持惟一code
1.在静态消息内限制对象的建立orm
2.外部不要调用allocserver
#import "MXSingleton.h"对象
staticMXSingleton * _instance;rem
@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
2、单例模式抽出模型层
1. 效果
1) 能够将数据统一放到模型层对象中
减小C层之间的交互
2) 能够针对模型层增长存储/读取的消息
专门负责保存/恢复
3) 能够将业务逻辑也抽到模型层中
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