单例

2018-04-22  本文已影响0人  Gunks

解析:

顾名思义就是只有一个实例,也就是内存唯一地址,通过全局的一个入口对这个实例对象进行访问,实现在不同的窗口之前传递数据

Non-ARC(非arc)

#import <Foundation/Foundation.h>

@interface NonARCSingleton : NSObject

+(NonARCSingleton *)sharedInstance;

@end
#import "NonARCSingleton.h"

@implementation NonARCSingleton

//定义一个全局变量,该变量存放在静态区,与该类进行绑定,类销毁的时候,该变量才会被销毁
static NonARCSingleton *sharedInstance=nil;

//重写allocWithZone方法 为对象分配一个内存 并用retain持有该对象
+(id)allocWithZone:(struct _NSZone *)zone{
    return [[self sharedInstance] retain];
}

//一个类方法,判断静态变量是否被初始化了,如果初始化了直接返回,没有就初始化,因为有了这一步,所以事先了单例
+(NonARCSingleton *)sharedInstance{
    if (sharedInstance == nil) {
        sharedInstance = [[super allocWithZone:NULL]init];
    }
    return sharedInstance;
}

//剩下的就适当重写引用计数哪些方法

@end

ARC

#import <Foundation/Foundation.h>

@interface ARCSingleton : NSObject

+(ARCSingleton *)sharedInstance;

@end

#import "ARCSingleton.h"

@implementation ARCSingleton
//定义一个全局变量,该变量存放在静态区,与该类进行绑定,类销毁的时候,该变量才会被销毁
static ARCSingleton  *sharedInstance=nil;

//上述是重写allocWithZone方法,定义一个dispatch_once_t的静态变量,确保初始化代码只会执行一次,dispatch_once函数需要传入两个参数,第二个是代码块,一但类被初始化了该代码块永远不再执行,确保内存空间只会执行一次
+(id)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [super allocWithZone:zone];
    });
    return sharedInstance;
}

//与上面的方法都能完成单例
+(ARCSingleton *)sharedInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[ARCSingleton alloc]init];
    });
    return sharedInstance;
}

//根据需求,选择重写 如果支持copy,则需要重写该方法,并直接返回静态实例
-(id)copyWithZone:(NSZone *)zone{
    return sharedInstance;
}

@end

上一篇 下一篇

猜你喜欢

热点阅读