现在的位置: 首页 > 综合 > 正文

Objective —C 单例模式 Singleton

2018年07月31日 ⁄ 综合 ⁄ 共 2123字 ⁄ 字号 评论关闭

 

Singleton 相当于全局变量。 

 

实际上ios系统已经有自己的单例模式例子,我们可以直接使用。

在ios中appDelegate被设计成单例模式,我们可以在在AppDelegate中声明变量并初始化

然后在需要使用该变量的地方插入如下的代码:
xxxAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.Your Variable

 

 

//下面是网上找的一个例子

static MyGizmoClass *sharedGizmoManager =nil;
+(MyGizmoClass*)sharedManager
{
@synchronized(self) {
if(sharedGizmoManager ==nil) {
[[self alloc] init]; //assignment not done here}
}
returnsharedGizmoManager;
}

//alloc 实际上调用 allowWithZone,参数ni,NSZone相当于一个内存池,nil表示在公共区域,会导致内存碎片,效率降低,程序员可自己建立一个NSZone.

+(id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if(sharedGizmoManager ==nil) {
sharedGizmoManager =[super allocWithZone:zone];
returnsharedGizmoManager; //assignment and return on first allocation}
}
returnnil; //on subsequent allocation attempts return nil}
-(id)copyWithZone:(NSZone *)zone
{
returnself;
}
-(id)retain
{
returnself;
}
-(unsigned)retainCount
{
returnUINT_MAX; //denotes an object that cannot be released}
-(void)release
{
//do nothing}
-(id)autorelease
{
returnself;
}
@synchronized(self) :这个就是同步语义,这里会自动加锁,以保证多线程的环境,不会new出多个实例来。
[[self alloc] 会默认调用 [self allocWithZone] 所以在sharedManager里没有将值给 sharedGizmoManager

 

 

from:http://blog.csdn.net/weiqubo/article/details/7350438

单例设计模式。因为此模式经常引起争议,所以我想有必 要在此解释一下单例。

原则上,单例是在程序生命周期里只被实例化过一次的 类。为了确保这一点,我们利用类的一个静态方法来生成和访问对象。

因此, 你是通过以便利方法来访问某个类的单例对象的,而不是用 alloc/init或者静态autorelease初始化方法。

在很多时候,我们使用一个某个类的唯一实例。最常见的就是一个程序的主类。

以下是以名为 RootViewController 创建的一个单例函数:

 

static RootViewController*sharedRootController = nil;
 
+(RootViewController *) sharedController{
    @synchronized(self){
        if (sharedRootController == nil) {
           sharedRootController = [[[self alloc] init] autorelease];(#add turorelease未必好,一般不用)
        }
    }
    return  singleController;
}

+(id) allocWithZone:(NSZone *)zone{
    @synchronized(self){
        if (sharedRootController == nil) {
           sharedRootController = [super allocWithZone:zone];
            return  sharedRootController;
        }
    } return nil;
}

代码说明:
1. synchronized   这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。
2. 网上搜索的代码,好像有一个没有加入 autorelease ,我觉得应该需要加。因为如果调用的函数没有release 就麻烦了。(个人认为IOS 上的程序,对于创建用于函数返回值的,都应该考虑 autorelease)
3. allocWithZone 这个是重载的,因为这个是从制定的内存区域读取信息创建实例,所以如果需要的单例已经有了,就需要禁止修改当前单例。所以返回 nil

抱歉!评论已关闭.