当前位置:首页 > 芯闻号 > 充电吧
[导读]Singleton 单例模式,又叫单子模式,是一种常见的软件设计模式。这种模式的特点就是应用了 Singleton 单例模式的类必须保证始终只有一个实例(对象)存在。许多时候系统中需要某个类只能同时存

Singleton 单例模式,又叫单子模式,是一种常见的软件设计模式。这种模式的特点就是应用了 Singleton 单例模式的类必须保证始终只有一个实例(对象)存在。许多时候系统中需要某个类只能同时存在一个对象,而且可以全局调用。

单例模式的思路是一个类能返回对象一个实例(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用 getInstance这个名称);当我们调用这个方法时,如果类持有的实例不为空,就返回这个实例;如果类保持的实例为空,就创建该类的实例,并将实例赋予该类保持的实例,从而限制用户只有通过该类提供的静态方法来得到该类唯一的实例。

单例模式在多线程场合下必须小心使用。当唯一的实例未创建时,如果有两个线程同时调用创建方法,那么他们同时没有检测到唯一的实例存在,从而同时各自创建了一个实例,这样就有两个实例被创建出来,从而违反了单例模式中实例唯一的原则。解决这个问题的办法是为标记类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

下面用一个例子来说明问题:

一:为你的单例类声明一个静态的实例,并且初始化它的值为nil。

二:在获取实例的方法中(比如下例中的 getInstance),只有在静态实例为nil的时候,产生一个你的类的实例,这个实例通常被称为共享的实例。

三:重写allocWithZone 方法,用于确定:不能够使用其他的方法来创建我们不得实例,限制用户只能通过获取实例的方法得到这个类的实例。所以,我们在allocWithZone方法中直接返回共享的类实例。

四:实现基本的协议方法 copyWithZone、release、retain、retainCount 和 autorelease,用于保证单例具有一个正确的状态。最后四种方法是哟娜与内存管理的代码,并不适用于垃圾收集代码。


[java] view plaincopyprint? @implementation TCPClient   static TCPClient * tcpClient = nil;      +(TCPClient*)getInstance{       if (tcpClient == nil) {           tcpClient = [[super allocWithZone:NULL]init];       }       return tcpClient;   }      + (id)allocWithZone:(NSZone *)zone{       return [[self getInstance]retain];//返回单例   }      - (id)copyWithZone:(NSZone*)zone{       return self;   }      - (id)retain{       return self;   }      - (NSUInteger)retainCount{       return NSUIntegerMax;   }      - (oneway void)release{///oneway用在分布式对象的API,这些API可以在不同的线程,甚至是不同的程序。oneway关键字只用在返回类型为void的消息定义中, 因为oneway是异步的,其消息预计不会立即返回。       //什么都不做   }   - (id)autorelease{       return self;   }   @end  


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  医疗解决方案目的的临界性是免除干扰影响的重要因素。虽然无线局域网络、蓝牙低功耗技术等无线接口本身可用于较大规模的网络运作,而且该项低功耗技术能改善原本蓝牙技术所采用的多项组件,然而,装置操作环境中

关键字: Android 数据库 游戏开发 sqlite

作为针对Red Hat Enterprise Linux的最后一步,Fedora的Red Hat开发人员计划将以前使用的Berkeley DB RPM数据库(RPMDB)切换到SQLite。

关键字: berkeley Linux sqlite rpm数据库

作者:朱金灿来源:http://blog.csdn.net/clever101            在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite

关键字: sqlite

原文转载于:https://www.cnblogs.com/5211314jackrose/p/5816066.html1、异步I/O模式    通常,当SQLite写一个数据库文件时,会等待,直到写

关键字: sqlite

    今天在Qt for Android跑离线数据,要使用到Sqlite数据库,当时是在pc端跑过了的,一切流程都很ok了,所以就准备转移到安卓设备上面试一试,发现刚运行初始化Sqlite时就出现了

关键字: qml sqlite localstorage

* 从 http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 下载了 sqlite-netFx35-setup-b

关键字: c# sqlite

SQLite 日期类型(转)SQLite日期类型简单示例:SELECT     datetime(CHANGE_DATE,'localtime'),     strftime('%Y-%m-%d',C

关键字: sqlite 日期类型

SQLite说C语言好,到底好在哪里?

关键字: C语言 sqlite

打开sqlite数据库需要用到sqlite3_open函数,但是sqlite3_open函数的第一个参数是数据库文件的绝对路径。它是有讲究的,必须是utf8字符串。也就是说假如文件路径是非utf8字符

关键字: sqlite

目录(?)[+]一、初识sqlite         偶然的机会接触到sqlite,不禁惊叹sqlite的体型小巧而功能强大(看来软件也不可貌相哦),Sqlite 是开源的内存数据库(也可以称之为内嵌

关键字: sqlite 数据库建立
关闭
关闭