iOS单例初步理解

iOS单例初步理解

在iOS开发中,系统自带的框架中使用了很多单例,非常方便用户(开发者,使用比如[NSApplication sharedApplication] 等),在实际的开发中,有时候也需要设计单例对象,为保证每次获取的对象都为同一个对象。
在iOS开发中创建单例具体步骤:
1.提供一个类方法:+ (instancetype)sharedXXXX;
2.创建一个全局静态变量static id _instance;
3.重写allocWithZone
4.重写copyWithZone

特举例子如下:
@interface MusicTool : NSObject
+ (instancetype)sharedMusicTool;
@end
static id _instance; // 全局变量
/**
* alloc方法内部会调用allocWithZone
*/
+ (id)allocWithZone:(struct _NSZone *)zone {
if (_instance == nil) {
@synchronized(self) {
if (_instance == nil) {
_instance = [super allocWithZone:zone];
}
}
}
return _instance;
}
/**
* 重写copy方法,防止copy出错
*/
- (instancetype)copyWithZone:(NSZone *)zone {
return _instance;
}

  • (instancetype)sharedMusicTool {
    if (_instance == nil) {
    @synchronized(self) {
    if (_instance == nil) {
    _instance = [[self alloc] init];
    }
    }
    }
    return _instance;
    }

第二种使用GCD创建单例方法
@interface DataTool : NSObject
+ (instancetype)shareDataTool;
@end
static id _instance;
+ (id)allocWithZone:(struct _NSZone *)zone {
if (_instance == nil) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
}
return _instance;
}
- (instancetype)copyWithZone:(NSZone *)zone {
return _instance;
}

  • (instancetype)shareDataTool {
    if (_instance == nil) {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _instance = [[self alloc]init];
    });
    }
    return _instance;
    }
    第三种使用饿汉模式
    @interface SoundTool : NSObject
  • (instancetype)sharedSoundTool;
    @end

static id _instance;
+ (void)load {
_instance = [[self alloc]init];
}

  • (instancetype)allocWithZone:(struct _NSZone *)zone {
    if (_instance == nil) {
    _instance = [super allocWithZone:zone];
    }
    return _instance;
    }

  • (instancetype)sharedSoundTool {
    return _instance;
    }

  • (instancetype)copyWithZone:(NSZone *)zone {
    return _instance;
    }

为保证兼容MRC还需要重写
static id _instace;

  • (id)allocWithZone:(struct _NSZone *)zone
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _instace = [super allocWithZone:zone];
    });
    return _instace;
    }

  • (instancetype)sharedDataTool
    {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    _instace = [[self alloc] init];
    });
    return _instace;
    }

  • (id)copyWithZone:(NSZone *)zone
    {
    return _instace;
    }

  • (oneway void)release { } //重写release

  • (id)retain { return self; } //重写retain
  • (NSUInteger)retainCount { return 1;} //重写retainCount
  • (id)autorelease { return self;} //重写autorelease
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值