单例创建的2种方式

 Objective-c 单例设计模式(Singleton

 一、什么是单例模式:(Singleton

 单例模式的意图是是的类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。

 

 二、什么情况下使用单例?

 1、类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。

 2、这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码

 

 三、单例设计模式的要点:

 1) 某个类只能有一个实例。

 2)他必须自行创建这个对象

 3)必须自行向整个系统提供这个实例;

 4)为了保证实例的唯一性,我们必须将

 -(id)copyWithZone:(NSZone *)zone

 +(id)allocWithZone:(NSZone *)zone

 -(id)retain

 -(oneway void)release

 -(id)autorelease 的实现方法进行覆盖。(具体实现请看程序)

 5)这个方法必须是一个静态类



一:多线程方式创建,值初始化一次

首先建立一个单例的类

1.构建一个单例的方法(.h文件)

+(instancetype)sharedManager ;

2.实现

#import "Aee.h"

@implementation Aee


/*
 1. 线程安全。
 2. 满足静态分析器的要求。
 3. 兼容了ARC
 */
+ (instancetype)sharedManager
{
    static Aee *sharedAccountManagerInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        sharedAccountManagerInstance = [[self alloc] init];
    });
    return sharedAccountManagerInstance;
}

@end

二、重写父类的方法

@implementation Bee


static Bee  *sharesingleton=nil;//必须声明为一个静态方法
+(Bee *)shareIstance
{
    if (sharesingleton == nil) {//检查唯一实例是否创建
        sharesingleton = [[super allocWithZone:NULL] init ];
        // 这里不是使用alloc,而是调用[[super allocWithZone:NULL] init ] ,为什么是super而不是self呢? 这是因为已经在self中冲在了基本对象的分配方法,所以需要借用父类的(NSobject)的功能帮助处理底层内存分配的杂务;
    }
    return sharesingleton;
}
// 覆盖NSObject方法
+(id)allocWithZone:(NSZone *)zone
{
    return [[self shareIstance] retain];
}
-(id)copyWithZone:(NSZone *)zone
{
    return self;//覆盖父类 NScoping 中的方法
}
-(id)retain
{
    return self;
}
-(NSUInteger)retainCount
{
    return NSUIntegerMax;//无穷大的数,表示不能释放
}
-(oneway void)release
{
    //什么也不做
}
-(id)autorelease
{
    return self;
}

//注意:所谓单例,即我们自己创建一个单例类,该类只能生成唯一的对象,即用  if (sharesingleton == nil)    方法来保证唯一性,为了防止该对象被复制(copy)或者retain 和 release 等操作,我们必须在所创建的单例的实现文件( .m 文件)中将父类的这些方法给覆盖,该目的是为了保证单例模式的一个严谨性。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值