iOS单例(设计模式)详解

单例(单态)模式
单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有一个全局唯一的访问点。它通常采用懒加载的方式在第一次用到实例的时候再去创建它。
 
注意:苹果大量使用了此模式。例如:[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager],所有的这些方法都返回一个单例对象。
 
你很可能会想为什么这么关心是否一个类有多个实例?毕竟代码和内存都是廉价的,对吗? 
 
有一些情况下,只有一个实例显得非常合理。举例来说,你不需要有多个Logger的实例,除非你想去写多个日志文件。或者一个全局的配置处理类:实现线程安全的方式访问共享实例是容易的,比如一个配置文件,有好多个类同时修改这个文件。
 
如何使用单例模式
首先来看看下面的图:
 
上面的图描述了一个有单一属性(它就是单一实例)和sharedInstance,init两个方法的类。
下面给大家个单例的实例:

#import <Foundation/Foundation.h>


@interface Singleton : NSObject

@property(nonatomic,assign)int a;

//单例通常有一个创建方法(或者叫获取方法),用于获取这个实例

//这个方法是类方法 方法名通常以shared/ main/ current/default等开头 后面是类名

+(Singleton*)sharedSingleton;

/*

+(Singleton *)mainSingleton;

+(Singleton*)currentSingleton;

+(Singleton*)defaultSingleton;

 */

@end


 

#import "Singleton.h"


@implementation Singleton


static Singleton* instance=nil;//创建一个存在于静态区的指针

+(Singleton*)sharedSingleton

{

    @synchronized(self)

    {//同时进行叫并发,同步是有顺序的,需要先完成某些条件才能运行;类似于排队.在一个对象访问synchronized的时候,别人就不能再访问了,只能等待.....解决了多线程访问的安全性.(也叫:同步锁)

    if (instance)

    {

        return instance;

    }

    instance=[[Singleton alloc]init];//如果没有内容,则让指针指向堆中的一块空间;

    //关键点是,只在堆中创建一次空间,供大家使用;

    //此处可以 初始化 一些实例变量

  }

    return instance;

}


//static Singleton *instance=nil;

//+(Singleton*)sharedSingleton

//{

//    @synchronized(self){

//        if (!instance) {

//           instance=[[Singleton alloc]init];

//        }

//    }

//    return instance;

//}


+(id)allocWithZone:(struct _NSZone *)zone

//alloc时调用allocWIthZone方法;类似于+的指定初始化方法


    @synchronized(self)

    {

        if (instance)

        {

            return instance;

        }

        instance=[[super allocWithZone:zone]init];

    

    }

    return instance;

}


-(oneway void)release

{

//空实现 引用计数不会-1, 就算外界误用了release也不会把我的单例对象给释放掉;

}

//重写autorelease 避免外界 释放我们

-(id)autorelease

{

    return instance;

}

-(id)retain

{

    return instance;

}

-(id)copyWithZone:(NSZone*)zone

{

    return instance;

}

-(id)mutableCopyWithZone:(NSZone*)zone

{

    return instance;

    

}

@end

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值