zoukankan      html  css  js  c++  java
  • 05-IOSCore

    单例模式

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

    要素:

    各个地方都能访问方法

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

    保持唯一

    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

  • 相关阅读:
    php 接触
    PHP Session可能会引起并发问题
    PHP大神的十大优良习惯
    PHP开发经验总结
    php命令行用法简介
    Python正则表达式指南
    PHP开发经验总结
    PHP命名空间概念解析
    高性能Web框架Zend Framework
    PHP代码优化技巧大盘点
  • 原文地址:https://www.cnblogs.com/yangmx/p/3583112.html
Copyright © 2011-2022 走看看