单例模式设置思想:可以保证程序在运行过程中,一个类只有一个实例(一个对象)。
#import "Person.h"
@implementation Person
// 加上了static 关键字,这个全局变量只能在该文件中使用,不能用extern(引用某个全局变量(并非定义))引用,以后声明全局变量,尽量用static
static id _person;
/*
static :修饰变量
1> 修饰全局变量
*全局变量的作用域仅限于当前文件内部
2> 修饰局部变量:
*局部变量的生命周期 跟 全局变量类似
*但是不能改变作用域(只能在函数内存在,出了函数外引用不到)
* 能保证局部变量永远只初始化依次,再程序运行过程中,永远只有一份内存
*/
// 因为调用alloc方法,alloc方法实质上是调用allWihtZone:方法
四、单例模式(懒汉式)
1.ARC
@interface HMDataTool : NSObject
+ (instancetype)sharedDataTool;
@end
@implementation HMDataTool
// 用来保存唯一的单例对象
static id _instace;
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}
+ (instancetype)sharedDataTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[self alloc] init];
});
return _instace;
}
- (id)copyWithZone:(NSZone *)zone
{
return _instace;
}
@end
2.非ARC
@interface HMDataTool : NSObject
+ (instancetype)sharedDataTool;
@end
@implementation HMDataTool
// 用来保存唯一的单例对象
static id _instace;
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}
+ (instancetype)sharedDataTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [[self alloc] init];
});
return _instace;
}
- (id)copyWithZone:(NSZone *)zone
{
return _instace;
}
- (oneway void)release {
}
- (id)retain {
return self;
}
- (NSUInteger)retainCount {
return 1;
}
- (id)autorelease {
return self;
}
@end
/*
当类加载当OC运行时环境中(内存),就会调用一次(一个类只会加载一次)
*/
+ (void)load
{
_person = [[self alloc]init];
}
/*
当第一次使用这个类的时候调用,就是说第一次创建这个类的对象的时候调用
*/
+ (void)initialize
{
}
/*
当类加载当OC运行时环境中(内存),就会调用一次(一个类只会加载一次)
*/
+ (void)load
{
_person = [[self alloc]init];
}
/*
当第一次使用这个类的时候调用,就是说第一次创建这个类的对象的时候调用
*/
+ (void)initialize
{
}