iOSでの単一設計モード
4975 ワード
単例モードとは?
単例モードは一般的なソフトウェア設計モードである.単一のインスタンスモードにより、システム内の1つのクラスに1つのインスタンスしかないことを保証し、そのインスタンスが外部にアクセスしやすく、インスタンスの個数の制御を容易にし、システムリソースを節約できることを保証することができる.
なぜ単例モードを使用するのですか?
システム内のクラスのオブジェクトが1つしか存在しないことを望む場合は、単一のモードが最善の解決策です.
単例モードの使用方法
単例モードは第1の書き方: 第2の書き方: 注意:同時に、copyWithZone、mutableCopyWithZone、非ARCの方法release、retain、retainCountも書き換えます.
単一マクロの抽出
単例モードは我々の日常開発で使用頻度が非常に高いため,コードの多重性を高めるために,単例モードのコードを1つのマクロに抽出することができ,後で使用するときにマクロで単例モードを迅速に実現することができる.
以下のコードをSingleton.hファイルに書き、以降、単例を使用する場合は、直接
使用方法:単例クラスを実装する.hファイル宣言に
単例モードは一般的なソフトウェア設計モードである.単一のインスタンスモードにより、システム内の1つのクラスに1つのインスタンスしかないことを保証し、そのインスタンスが外部にアクセスしやすく、インスタンスの個数の制御を容易にし、システムリソースを節約できることを保証することができる.
なぜ単例モードを使用するのですか?
システム内のクラスのオブジェクトが1つしか存在しないことを望む場合は、単一のモードが最善の解決策です.
単例モードの使用方法
単例モードは
と
に分けることができ、iOSでは
をよく使用しています.次に、日常開発で単例モードをどのように運用するかを見てみましょう.+ (id)sharedInstance {
static testClass *sharedInstance = nil;
// ,
@synchronized(self) {
if (!sharedInstance) {
sharedInstance = [[self alloc] init];
}
}
return sharedInstance;
}
+ (instancetype)shareTools
{
return [[self alloc] init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// : ,
// ,
// ,
static id instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
単一マクロの抽出
単例モードは我々の日常開発で使用頻度が非常に高いため,コードの多重性を高めるために,単例モードのコードを1つのマクロに抽出することができ,後で使用するときにマクロで単例モードを迅速に実現することができる.
以下のコードをSingleton.hファイルに書き、以降、単例を使用する場合は、直接
Singleton.h
をプロジェクトに追加すると、単例を迅速に実現できます.使用方法:単例クラスを実装する.hファイル宣言に
SingleInterface(*name*)
,.mファイルにSingleImplementation(*name*)
と書くと,単例モードが実装される.#define SingleInterface(name) +(instancetype)share##name
#if __has_feature(objc_arc)
// ARC
#define SingleImplementation(name) +(instancetype)share##name \
{ \
return [[self alloc] init]; \
} \
static id _instance; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return self; \
}
#else
// MRC
#define SingleImplementation(name) +(instancetype)share##name \
{ \
return [[self alloc] init]; \
} \
static id _instance; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return self; \
} \
- (oneway void)release \
{} \
- (instancetype)retain \
{ \
return self; \
} \
- (NSUInteger)retainCount \
{ \
return MAXFLOAT; \
}
#endif```