解析:
顾名思义就是只有一个实例,也就是内存唯一地址,通过全局的一个入口对这个实例对象进行访问,实现在不同的窗口之前传递数据
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
网友评论