iOS中的单例

作者: luodezhao | 来源:发表于2015-11-22 14:21 被阅读169次

    什么是单例,为什么要用单例?

    1,单例模式:

    确保某一个类只有一个实例。单例模式只会生成一个对象。内存空间永远是一个,保证实体的唯一性。其他类可以通过全局的入口点对这个实例进行访问。iOS sdk中也有许多类使用了单例模式,例如UIApplication:当程序启动时,会调用UIApplicationMain方法,在该方法中,会实例化一个UIApplication对象,之后在程序中的任意地方调用shareApplication都将返回一个与当前应用程序相关的UIApplication实例。以及:[NSUserDefaluts standardUserDefaults]也是返回的一个单例对象,因为不能让不同的ud对象去修改文件

    2,单例模式的使用:

    1,GCD:

    + (MyDataHelper *)shareMyDataHelper {

    static MyDataHelper * myDataHelper = nil;

    static dispatch_once_t takeOnce;

    dispatch_once(&takeOnce,^{

    myDataHelper = [self alloc]init];

    } );

    return myDataHelper;

    }

    利用GCD,可以保证初始化代码只实现一次。前提是takeonce指针也必须是全局或者静态变量。

    因为static 修饰的成员变量只会初始化一次,如果不声明为静态变量,那么每次进来,都会重置变量为nil,那么就会重新创建对象。

    2,重写init,alloc方法,

    1)先写一个创建单例的方法

    static MyDataHelper * myDataHelper = nil;

    + (MyDataHelper *)shareMyDataHelper {

    @synchronized(self)

    {

    if (myDataHelper == nil)

    {

    [self alloc]init];

    }

    return myDataHelper;

    }

    + (id)allocWithZone:(NSZone *)zone//在alloc分配内存空间的时候,是调用的allocWithZone分配空间

    @synchronized(self){

    if (myDataHelper == nil)

    {

    myDataHelper = [super allocWithZone:zone];

    return myDataHelper;

    }

    }

    return nil;

    -(id)init {

    @synchronized(self){

    if( self ==[super init])

    {

    //初始化

    }

    return self;

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

    return self;

    }

    以下是非ARC模式下需要添加的

    -(unsigned)retainCount{

    return 1// 永远到返回1

    }

    - (oneway void)release {

    释放的时候什么也不做 }

    (oneway 修饰符)表示此操作是单项的,这样做意味着方法就算返回了什么,调用者也拿不到这个方法

    如果需要实现单例的多态,就拿到单例对象之后,重新进行初始化就行。

    相关文章

      网友评论

        本文标题:iOS中的单例

        本文链接:https://www.haomeiwen.com/subject/oxshcttx.html