系统单例举例
1>UIApplication
2>NSFileManager
3>NSNotificationCenter
4>NSUserDefaults
5>NSURLSession
6>UIScreen(应用程序窗口)
7>[UIDevice currentDevice](当前设备)
8>[NSURLCache sharedURLCache](请求缓存):
9>[NSHTTPCookieStorage sharedHTTPCookieStorage](应用程序cookies池):
单例的使用场景:
1>用户信息:登录的时候,登录完成之后,到哪儿访问用户信息的时候都是一样的
2>不同的界面或者控制器需要访问同一个对象,那就需要使用单例
实现单例的方式
1>重写allocWithZone
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static id zoneShare = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
zoneShare = [super allocWithZone:zone];
});
return zoneShare;
}
2>自定义一个方法,通过调用此方法实现单例("懒汉模式--创建的晚一点)
+ (instancetype)sharedInstance
{
//我们把声明的对象放在 静态区,这样能够确保 有一块内存区域
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[super alloc]init];
});
return zoneShare;
}
3>在initialize方法中("饿汉模式 -- 创建的早一点)
initialize 他的调用会比 shareInstance 的调用提前
static id per;
+ (void)initialize {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
per = [[Person alloc]init];
});
}
4>在load方法中(这是类加载的时候调用,比AppDelegate还要早)
- 加载这个类的时候,就会调用这个方法
- 有些运行时的地方会用到 这个方法
+ (void)load {
NSLog(@"%s",__func__);
}
PS:注意
1>如果是单例的话,那么单例对象是不会销毁的,因为有静态的强指针指向,直到程序结束之后才销毁,所以
dealloc方法是不会走的
代码实例1:绝对单例
写法1:
//YYNetWorkTool.h文件:
#import
@interface YYNetWorkTool : NSObject
@property(nonatomic,copy) NSString *baseURL;
+(instancetype)sharedNetWorkTool;
+(instancetype)defaultNetWorkTool;
@end
//YYNetWorkTool.m文件
#import "YYNetWorkTool.h"
@implementation YYNetWorkTool
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
static id instance = nil;
if(instance == nil){
instance = [super allocWithZone:zone];
}
return instance;
}
+(instancetype)sharedNetWorkTool{
return [[self alloc] init];
}
+(instancetype)defaultNetWorkTool{
return [[self alloc] init];
}
@end
写法2:
//1.YYNetWorkTool.h文件:
#import
@interface YYNetWorkTool : NSObject
@property(nonatomic,copy) NSString *baseURL;
+(instancetype)sharedNetWorkTool;
+(instancetype)defaultNetWorkTool;
@end
//2.YYNetWorkTool.m文件
#import "YYNetWorkTool.h"
@implementation YYNetWorkTool
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
static id instance = nil;
static dispatch_once_t onceTonken;
dispatch_once(&onceTonken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
+(instancetype)sharedNetWorkTool{
return [[self alloc] init];
}
+(instancetype)defaultNetWorkTool{
return [[self alloc] init];
}
@end
代码实例2:普通单例写法
- 以下两种写法是根据需要创建单例对象,即只要通过default活着shared类方法创建的就是同一个单例,但是
- 如果通过普通的alloc|init方法创建的就不是单例对象
写法1:
//1.YYNetWorkTool.h文件:
#import
@interface YYNetWorkTool : NSObject
@property(nonatomic,copy) NSString *baseURL;
+(instancetype)sharedNetWorkTool;
+(instancetype)defaultNetWorkTool;
@end
//2.YYNetWorkTool.m文件
#import "YYNetWorkTool.h"
@implementation YYNetWorkTool
+ (instancetype)sharedNetWorkTool
{
static id instance = nil;
static dispatch_once_t onceTonken;
dispatch_once(&onceTonken, ^{
instance = [[YYNetWorkTool alloc]init];
});
return instance;
}
+(instancetype)defaultNetWorkTool
{
static id instance = nil;
static dispatch_once_t onceTonken;
dispatch_once(&onceTonken, ^{
instance = [[YYNetWorkTool alloc]init];
});
return instance;
}
@end
写法2:
//1.YYNetWorkTool.h文件:
#import
@interface YYNetWorkTool : NSObject
@property(nonatomic,copy) NSString *baseURL;
+(instancetype)sharedNetWorkTool;
+(instancetype)defaultNetWorkTool;
@end
//2.YYNetWorkTool.m文件
#import "YYNetWorkTool.h"
@implementation YYNetWorkTool
+ (instancetype)sharedNetWorkTool
{
static id instance = nil;
if(instance == nil)
{
instance = [[YYNetWorkTool alloc]init];
}
return instance;
}
+(instancetype)defaultNetWorkTool
{
static id instance = nil;
if(instance == nil)
{
instance = [[YYNetWorkTool alloc]init];
}
return instance;
}
@end
感兴趣的童鞋可以了解下:iOS开发之Weak Singleton