ARC模式下,分配内存,init只执行一次的代码:
//全部变量和局部变量有所区分带_
static id _instance;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (instancetype)init{
/**
* 保证init只执行一次
*
*/
static id obj =nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if ((obj = [superinit]) != nil) {
//加载所需要的资源
}
});
self = obj;
return self;
}
/**
* 重写这个方法:控制内存只分配一次
*/
+(instancetype)allocWithZone:(struct_NSZone *)zone{
//定义一份变量(整个程序运行过程中,只有一份)
/**
* 里面的代码永远只执行一次
*/
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [superallocWithZone:zone];
});
return_instance;
}
+ (instancetype)shareAudioTool{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[selfalloc] init];
});
return_instance;
}
非ARC模式下:
需要重写下面的方法(还有几个没有写上去):
//oneway:分布式对象这个对象可能被多个程序访问
- (oneway void)release{
}
- (instancetype)autorelease{
return self;
}
- (NSUInteger)retainCount{
return 1;
}
+ (id)copyWithZone:(struct_NSZone *)zone{
return _instance;
}
定义一个宏 新建.h文件
//## :连接字符串和参数
#define liwei(name) +(instancetype)shared##name;
在.h中
#import "head_h.h"
liwei(love)
+(instancetype)shareAudioTool{
}
为了实现.m中的宏定义 需要通过以下代码:
//## :连接字符串和参数
#define liwei(name) +(instancetype)shared##name;
#define badboy(name) \
- (instancetype)init{\
static id obj =nil;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
if ((obj = [super init]) != nil) {\
\
}\
});\
self = obj;\
return self;\
}\
\
\
+(instancetype)allocWithZone:(struct _NSZone *)zone{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
return _instance;\
}\
\
+ (instancetype)shareAudioTool{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [[self alloc] init];\
});\
return _instance;\
}