不同的变量在手机存储器中的存储位置
序号 | 位置 | 存放的变量 |
---|---|---|
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;
}
网友评论