zoukankan      html  css  js  c++  java
  • objectivec 单例模式详解

    最近在项目中需要用到单例模式(singleton),于是对谷歌了一些资料发现objective-c中的单例不是想象中的,apple官方文档建议并非如此,代码量是我好几倍,但是既然官方建议一定是有道理的,谷歌了写资料,多数都是建议这么使用,却没人对此做详解

    因为没理解透,用着不踏实,所以决定做些调试,了解透彻!

    看完如还有疑问可以进IOS中高级开发群:118623167 和大家交流

    按照一般的思路,如下

    static MyClass *class = nil;

    @implementation MyClass

    +(MyClass *)sharedMyClass{

        if (!class) {

            [[self alloc] init];

        }

        returnclass;

    }

    @end

     

    调试发现

    MyClass *A = [[MyClass alloc] init];

    NSLog(@"A:%@",A);

    MyClass *B = [MyClass sharedMyClass];

    NSLog(@"B:%@",B);

     

    打印出的是

    A:<MyClass: 0x6c72d30>

    B:<MyClass: 0x6a87e60>

    不是一个内存地址,也就是不是同一个实体

     

    官方如下方式实现

    static MyClass *class = nil;

     

    @implementation MyClass

     

    +(MyClass *)sharedMyClass{

        @synchronized(self){  //为了确保多线程情况下,仍然确保实体的唯一性

            if (!class) {

                [[self alloc] init]; //该方法会调用 allocWithZone

            }

        }

        returnclass;

    }

     

    +(id)allocWithZone:(NSZone *)zone{

        @synchronized(self){

            if (!class) {

                class = [super allocWithZone:zone]; //确保使用同一块内存地址

                return class;

            }

        }

        returnnil;

    }

     

    - (id)copyWithZone:(NSZone *)zone;{

        return self; //确保copy对象也是唯一

    }

     

    -(id)retain{

        return self; //确保计数唯一

    }

     

    - (unsigned)retainCount

    {

       return UINT_MAX;  //装逼用的,这样打印出来的计数永远为-1

    }

     

    - (id)autorelease

    {

        return self;//确保计数唯一

     

    - (oneway void)release

    {

         //重写计数释放方法

    }

    @end

     

    再调试

    MyClass *A = [[MyClassalloc] init];

    NSLog(@"A:%@",A);

    MyClass *B = [MyClasssharedMyClass];

    NSLog(@"B:%@",B);

    MyClass *C = [A copy];

    NSLog(@"C:%@",C);

     

    打印出的是

    A:<MyClass: 0x6a1e130>

    B:<MyClass: 0x6a1e130>

    C:<MyClass: 0x6a1e130>

    都是指向同一块内存地址

    答案已经出来了

    apple建议的方式显然真正的确保了实体的唯一性

  • 相关阅读:
    学习OSGI---建项目,运行配置
    MongoDB 安装
    利用 ^ 异或运算符 进行交换(不需要第三方变量)
    2019HDU暑期多校训练-1004equation-方程求解
    HDU 4417-Super Mario-线段树+离线
    HDU 3333-Turing Tree-线段树+离散+离线
    POJ 2528-Mayor's posters-线段树+离散化
    POJ 2631-Roads in the North-树的直径
    POJ 2299-Ultra-QuickSort-线段树的两种建树方式
    noip2009最优贸易——spfa
  • 原文地址:https://www.cnblogs.com/supercheng/p/singlemodal.html
Copyright © 2011-2022 走看看