单例的简单实现

实现单例的步骤:

 1. 定义一个静态变量,能够记录第一次实例化出来的对象

 2. 定义一个shared方法,供其他对象使用

 3. 实现shared方法,使用 @dispatch_once { _instance = [[self alloc] init]; }

 

例如:

static SoundTools*_instance;

+ (instancetype)sharedSoundTools {

    static dispatch_once_t onceToken;

   dispatch_once(&onceToken, ^{

       _instance = [[self alloc] init];

   });

   

    return _instance;

 

}

 

// 使用指定的内存区域,为对象分配空间调用的类方法

// allocWithZone方法,无论对象如何被实例化,最终都会调用到这个方法

// 如果要"彻底的解决"用类方法和alloc方法实例化出来的对象一致!

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

    

    static dispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

       _instance = [superallocWithZone:zone];

    });

    

    return _instance;

}

 

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

    //建立一个self对象的拷贝,self既然已经存在,_instance应该已经被实例化了

    return _instance;

}


二:将单例抽取成一个宏,下次直接使用即可。

1,定义文件Singleton.h

/**

 提示:如果是MRC程序,请粘贴以下代码

 

 #if!__has_feature(objc_arc)

 -(oneway void)release { }

 -(id)autorelease { return _instance; }

 -(id)retain { return _instance; }

 -(NSUInteger)retainCount { return UINT32_MAX; }

 #endif

 */

// 1. 替换.h中的内容

#definesingletonInterface(className)      +(instancetype)shared##className;

 

// 2. 替换.m中的内容

#definesingletonImplementation(className) \

staticclassName *_instance; \

+(instancetype)shared##className { \

   static dispatch_once_t onceToken; \

   dispatch_once(&onceToken, ^{ \

       _instance = [[self alloc] init]; \

   }); \

   return _instance; \

} \

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

   static dispatch_once_t onceToken; \

   dispatch_once(&onceToken, ^{ \

       _instance = [super allocWithZone:zone]; \

   }); \

   return _instance; \

} \

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

   return _instance; \

}

 

// 提示最后一行不要使用 \


三:具体实现(新建了一个CZNewObject类)

.h文件:

//先导入头文件

#import "Singleton.h"

 

@interface CZNewObject : NSObject

 

singletonInterface(CZNewObject);

 

- (void)playWithName:(NSString*)name;

 

@end

 

 

.m文件:

 

@implementationCZNewObject

 

singletonImplementation(CZNewObject);

 

@end


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值