在iOS開發中經常會用到單例,比如每個iOS程序本身就是一個單例,在比如進行個人偏好設置存儲的時候用的也是一個單例。那我們如何自己來寫一個單例類呢,用自己的單例對象呢?下面是我寫的一個單例的頭文件里的代碼,這個文件主要是一些宏。使用步驟寫的都很詳細,ARC或MRC都可以使用。有了這個頭文件,只要在使用的時候包含這個文件,基本上就OK了。具體怎么使用,下面有詳細說明。
// Singleton.h
// 單例的宏
/*
使用方法
1:包含這個頭文件
2:在.h文件總包含 singleton_h(name) 里面的name是你想要生成單例對象時的名字
3:在.m文件中包含 singleton_m(name) 里面的name是你想要生成單例對象時的名字
注意2、3步中的name要一致
4:寫init初始化方法,因為每個單例類初始化的內容不一樣,所以沒有寫到宏里面,在創建單例類時記得寫init方法
5: 創建單例對象 [ 類名 share+(name)]
例如我們創建一個Person類的單例: 1 在Person的.h 文件中 singleton_h(Person)
2 在Person的.m 文件中 singleton_m(Person)
3 在Person的.m文件中寫初始化方法
-(instancetype)init{
static id obj;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if ((obj = [super init])) {
//這里進行本類的初始化
}
});
self = obj;
return self;
}
}
4 在使用的地方包含Person這個類的頭文件 [ Person sharePerson ];
// ## :連接字符串和參數
// / :表示下一行也是當前行的內容
*/
#ifndef Singleton_h
#define Singleton_h
#define singleton_h(name) +(instancetype)share##name;
#if __has_feature(objc_arc) // ARC
#define singleton_m(name) /
static id instance;/
+(instancetype)allocWithZone:(struct _NSZone *)zone{/
/
static dispatch_once_t onceToken;/
dispatch_once(&onceToken, ^{/
instance = [super allocWithZone:zone];/
});/
/
return instance;/
}/
/
+(instancetype)share##name{/
return [[self alloc]init];/
}/
+(id)copyWithZone:(struct _NSZone *)zone{/
return instance;/
}
#else //非ARC
#define singleton_m(name) /
static id instance;/
+(instancetype)allocWithZone:(struct _NSZone *)zone{/
/
static dispatch_once_t onceToken;/
dispatch_once(&onceToken, ^{/
instance = [super allocWithZone:zone];/
});/
/
return instance;/
}/
/
+(instancetype)share##name{/
return [[self alloc]init];/
}/
/
-(oneway void)release{/
/
/
}/
-(instancetype)autorelease{/
return instance;/
}/
/
-(instancetype)retain{/
return instance;/
}/
/
+(id)copyWithZone:(struct _NSZone *)zone{/
return instance;/
}/
/
-(NSUInteger)retainCount{/
return 1;/
}
#endif
#endif
新聞熱點
疑難解答