iOS 单例∞

2020-04-12  本文已影响0人  HH思無邪

提一嘴简书创建表格

不同的变量在手机存储器中的存储位置

序号 位置 存放的变量
1 临时变量(由编译器管理自动创建/分配/释放的,栈中的内存被调用时处于存储空间中,调用完毕后由系统自动释放内存)
2 通过alloc、calloc、malloc或new申请内存,由开发者手动在调用之后通过free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存,在ARC模式下,由系统自动管理
3 全局区域 静态变量(编译时分配,APP结束时由系统释放)
4 常量 常量(编译时分配,APP结束时由系统释放)
5 代码区 存放代码

什么是单例

简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内存,在APP结束后由系统释放这部分内存内存。

系统为我们提供的单例类有哪些?

UIApplication(应用程序实例类)
NSUserDefaults(偏好设置)
NSNotificationCenter(消息中心类)
NSFileManager(文件管理类)
NSURLCache(请求缓存类)
NSHTTPCookieStorage(应用程序cookies池)

使用场景

经常调用的类,如播放音乐、网络请求、提示框等,我都会采用单例模式

实现一个单例 --- 保证只创建一个实例

GCD方式创建单例

static id _instance;   

+ (instancetype)allocWithZone:(struct _NSZone *)zone  
{   
    static dispatch_once_t onceToken;   
    dispatch_once(&onceToken, ^{   
        _instance = [super allocWithZone:zone];   
    });   
    return _instance;   
}   

+ (instancetype)sharedInstance  
{   
    static dispatch_once_t onceToken;   
    dispatch_once(&onceToken, ^{   
        _instance = [[self alloc] init];   
    });   
    return _instance;   
}   

- (id)copyWithZone:(NSZone *)zone   
{   
    return _instance;   
}  

- (id)mutableCopyWithZone:(NSZone *)zone {   
    return _instance;   
}
上一篇下一篇

猜你喜欢

热点阅读