zoukankan      html  css  js  c++  java
  • Singleton单例设计模式

    新建单例类

    Singleton.h/.m文件

    #import <Foundation/Foundation.h>
    @interface Singleton : NSObject
    + (Singleton *)shareInstance;
    @end
    //.m文件
    #import "Singleton.h"
    
    static Singleton *s = nil;//声明一个全局的指针
    @implementation Singleton
    
    //如何保证这个单例获取的是同一个对象
    + (Singleton *)shareInstance
    {
        //同步锁 解决多线程的情况时候出现问题,只有先创建一个才会创建另一个
        //如果是在多线程里面,刚开始的时候,如果有俩个线程同时第一次调用这个方法,会产生俩个线程创建了俩个对象,为了避免这种情况的发生,我们需要做如下修改:
        @synchronized(self){ //添加了一个同步锁,同步锁的作用就是一次只能有一个线程在访问{}内部的内容,如果有多个内容的话,那么其他线程就处于等待状态.
        if(s == nil){
            s = [[Singleton alloc] init];
    //        s = [[super allocWithZone:nil] init];
        }
        }
        return s;
    }
    //下面注释掉的时防止在MRC下 错误使用的时候解决的方法
    // 如果这边用了alloc所以写下面的 单例 用类方法创建
    //+(instancetype)allocWithZone:(struct _NSZone *)zone
    //{
        //这样写以后,会出现很严重的问题,递归,上面调用alloc的方法,然后alloc相当于调用allocWithZone方法,此时会出现问题,所以上面的代码修改成了s = [[super allocWithZone:nil] init];
        //这个时候,写完之后我们就可以在外界使用alloc,init了,但是也可能会出现sb 看到了alloc 下面根了个release,这个时候需要做的就是重写release.如果外界使用了retain,那么我们就需要重写retain方法,如果外界使用了copy,那么我们就需要重写copy方法.
    //    return [Singleton shareInstance];
    //}
    
    //- (oneway void)release
    //{
    // 
    //
    //}
    //
    //-(instancetype)retain
    //{
    //    return s;
    //}
    //-(id)copy
    //{
    //    return s;
    //}
    //-(instancetype)autorelease
    //{
    //    return s;
    //}
    @end
    

    主程序中写 引入单例类

        //单例
        //单例其实是一种设计模式,
        //单例 顾名思义:一个类只有唯一的一个实例
        //系统的单例类有UIDevice,UIScreen,NSBundle,NSFileManager,NSUserDefaults等等.
        //单例类一般会提供一个类方法,获得这个唯一的实例
        /*
        //例如:[UIDeviece currentDevice];
               [UIScreen mainScreen];
               [NSBundle mainBundle];
               [NSFileManager defaultManager];
        */
        
        //这个类方法常以default,share,main等单词开头,与便利构造器的命名规范是不同的,
        //我们自己在定义单例类的时候,一定要保证外界能获得唯一的实例! 即每次获得同一个对象.
        
        Singleton *p = [Singleton shareInstance];
        Singleton *p1 = [Singleton shareInstance];
        Singleton *p2 = [Singleton shareInstance];    
        NSLog(@"
    p = %p
    p1 = %p
    p2 = %p
    ",p,p1,p2);
        
    //    Singleton *p3 = [[Singleton alloc] init];  ///单例不能这么写
    
    On the road。。。
  • 相关阅读:
    ASP.NET 2.0 用户注册控件的密码验证问题
    编程使用GridView,DataList的模版列
    在您的站点上添加 Windows Live Favourites 收藏入口
    推荐个很好玩的开源项目Ascii Generator dotNET
    Castle ActiveRecord 在Web项目和WinForm项目中
    HTML解析器项目进展和新的构思
    SilverLight 的跨域跨域访问
    SQL 语句之Join复习
    【笔记】提高中文分词准确性和效率的方法
    ASP.NET 动态加载控件激发事件的问题
  • 原文地址:https://www.cnblogs.com/ianhao/p/4517965.html
Copyright © 2011-2022 走看看