单例类模式

  • 单例类:
    只能拥有一个实例变量的类;

  • 为什么需要单例设计?
    1.单例设计是用来限制一个类只能创建一个对象,那么此对象的属性可以存储全局共享的数据,实业的类都可以访问设置,此单例类对象中的属性数据.
    2.如果一个类创建的时候非常的消耗性能,如果能满足需求的话,这个类可以设置为单例类以节约性能.

  • 常用的单例类

[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSBundle mainBundle]
[NSNotificationCenter defaultCenter]
[NSFileManager defaultManager]
  • 自定义单例类
    1).命名方法:shared+类名
+(instancetype)sharedImageManager

2).
static MCImageManager *manger = nil;

+ (instancetype)sharedImageManager
{
@synchronized(self)
{//同步锁, 同一个时间,同时调用同一个该方法,有可能创建出不同的对象,所以加一个同步锁
if(manager == nil)
{
manager = [[super allocWithZone:NULL] init];
}
}
return manager;
}

②`+ (instancetype)sharedImageManager
{
//使用GCD去创建单例 在整个软件生命周期中只执行一次
// static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
    manager = [[MCImageManager alloc]init];
});
return manager;

}`

3).重写 alloc /retain/release/autorelease/copy

①重写allocWithZone方法 防止通过alloc方法创建新对象 ,只要调用alloc最终都会调用allocWithZone

- (id)init 
{
    self = [super init];
    if(self) 
    {
    }
    return self;
}

+ (id)allocWithZone:(struct _NSZone *)zone 
{
    return [self sharedImageManager];
}

②MRC下防止对象被 retain/release/autorelease/copy 所以这些方法也需要重写.因为单例类的特点不应该被释放,引用计数也不应该加1

- (id)retain 
{
    return self;
}
- (oneway void)release 
{
//重写release,方法内部没有代码
}

- (id)autorelease 
{
    return self;
}

//返回1或者返回NSUIntegerMax都行,通过引用计数这个参考标准告诉使用者这个对象是释放不掉的
- (NSUInteger)retainCount 
{
    return NSUIntegerMax;
}

+ (id)copyWithZone:(struct _NSZone *)zone 
{    //只要调用copy就会调用这个方法
    return [self sharedImageManager];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值