写一个单例

写一个单例吧,记性不好,还是烂笔头好使。
比如单例类名叫Singleton

.m 文件

#import "Singleton.h"
static Singleton* singleton = nil;
@interface Singleton()<NSCopying,NSMutableCopying>
@end
@implementation Singleton
//单例方法
+ (Singleton *)shareSingleton{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        singleton = [[super allocWithZone:NULL] init];
    });
    return singleton;
}



/*
    重写 allocWithZone: 方法。
    如果我们创建单例的时候直接调用shareSingleton方法,已经能达到我们想要的效果,但是如果其他同事在不知情的情况下调用了 [[Singleton alloc] init]创建对象,就会重新分配一块内存,创建一个新的对象。那这样就破坏我们使Singleton以单例存在的初衷。
    alloc 方法调用时其实调用的是allocWithZone:方法,所以我们需要重写allocWithZone:方法,使它不创建新对象,而是返回单例

    注:该方法的参数 zone 可以忽略,

*/
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    return [Singleton shareSingleton];
}



/*
    重写 copy 方法
    copy 方法被实例对象调用后,会被拷贝一个新的对象,存在重新分配的内存中,如此,也破坏了该类的单例模式,需要重写该方法,返回单例对象
*/
- (id)copy{
    return [Singleton shareSingleton];
}



/*
    重写mutableCopy方法
     原因同上
*/
-(id)mutableCopy{
    return [Singleton shareSingleton];
}

到这,就完成了一个单例的设计。

不知道你是否有个疑虑。[Singleton new]不也能创建一个新对象吗,为啥不重写 new 方法呢 ?因为调用 new 方法时也会调用 allocWithZone:方法。

那么[Singleton new]和[[Singleton alloc] init] 有什么区别呢?

+ new
{ 
id newObject = (*_alloc)((Class)self, 0); 
Class metaClass = self->isa; 
if (class_getVersion(metaClass) > 1) 
return [newObject init]; 
else
return newObject; 
} 

//而 alloc/init 像这样: 
+ alloc 
{ 
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
} 
- init 
{ 
return self; 
} 

看源码知道,new 的内部实现就是分配内存,调用init方法,初始化对象。不同的是 alloc 使用了 zone,而 zone 这个现在可以忽略了
如图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值