iOS开发之单例

系统单例举例

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

iOS开发之单例_第1张图片
小七.jpg

你可能感兴趣的:(iOS开发之单例)