zoukankan      html  css  js  c++  java
  • iOS经常使用设计模式——单例模式

    第一部分: 创建一个单例对象

     

    单例的应用场景:

    单例模式用于当一个类仅仅能有一个实例的时候。 通常情况下这个单例代表的是某一个物理设备比方打印机,或是某种不能够有多个实例同一时候存在的虚拟资源或是系统属性比方一个程序的某个引擎或是数据。

    用单例模式加以控制是很有必要的。

    什么是单例模式?

    单例是一种经常使用的软件设计模式。在应用这个模式时,单例对象的必须保证仅仅有一个实例存在。很多时候整个系统仅仅须要拥有一个的全局对象。这样有利于我们协调系统总体的行为。

     

    单例设计模式须要达到以下几个目的:1.)封装一个共享的资源; 2.)提供一个固定的实例创建方法。 3.)提供一个标准的实例訪问接口

     

    经常使用的定义单例的方法(ARC+GCD)

    //实现一个创建单例对象的类方法
    
    static ClassType *objName = nil; 
    
    + (ClassType *) sharedInstance{
    static dispatch_once_t oneToken = 0;
    dispatch_once(&onceToken, ^{
    objName = [[super allocWithZone: NULL] init];
    });
    return objName; 
    }
    
    //重写几个方法。防止创建单例对象时出现错误
    -(id) init{
    If(self = [super init])
    {
    //初始化单例对象的各种属性
    }
    return self;
    }
    
    +(id)allocWithZone: (struct _NSZone *) zone{
    return [self sharedInstance];
    }
    
    //这是单例对象遵循<NSCopying>协议时须要实现的方法
    -(id) copyWithZone: (struct _NSZone *)zone{
    return self;
    }
    

    第二部分:就地取材使用UIApplication单例

    直接在AppDelegate中创建实例变量。然后在项目的其它文件里使用这些变量。

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shareApplication] delegate];
    appDelegate.a = 10086;
    appDelegate.globalString = @”中国想联通’;
    

    这样,你能够定义一个全局实例变量。

    具体请參考:http://blog.csdn.net/casablaneca/article/details/21074413

    第三部分:在项目中使用单例设计模式

    项目描写叙述:我们希望通过一个button的点击事件触发单例对象中的一个属性值发生变化。然后使用KVO在ViewController的两个子视图(LeftView, RightView)上监听这个属性值得变化,并将变化后的数值在LeftView和RightView上显示出来。

    1.) 在ViewController上设置一个button和一个触发事件

    -(IBAction) refreshData: (id) sender{
    //stockForKVO为单例对象
    stockForKVO.price = arc4random()%100;
    }
    

    2.) 在LefeView和RightVIew的对象中使用KVO监听单例对象中属性值的变化

     stockForKVO = [StockData sharedInstance];
        [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    
    //实现回调方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
        if ([keyPath isEqualToString:@"price"]) {
            showLabel.text = [NSString stringWithFormat:@"%f",stockForKVO.price];
            NSLog(@" left change: %@", change);
        }
    }
    
    

    3.)实现后的效果如图2所看到的

     

    图2: 右边为button事件触发后的场景,左边为初始化时的场景

    项目的源代码下载地址: http://download.csdn.net/detail/luozhonglan/8005001


     


     

     

     

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7224376.html
Copyright © 2011-2022 走看看