iOS単例モード実装(二)マクロ定義による高速実装

3014 ワード

前節ではgcdを用いて単一例モードを迅速に実現することについて述べた.
1つのプロジェクトには、いくつかのクラスが単一のモデルを実現する必要がある可能性があります.より効率的な符号化のために、c言語におけるマクロ定義を用いて実現することができる.
新しいSingleton.hのヘッダファイル.
// @interface
#define singleton_interface(className) \
+ (className *)shared##className;


// @implementation
#define singleton_implementation(className) \
static className *_instance; \
+ (id)allocWithZone:(NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
+ (className *)shared##className \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
}

 
ここでは、インスタンスの共有方法をshared"ClassName"と仮定する.
メソッド名shared"ClassName"が繋がっているので、マクロが署名中の"ClassName"を正しく置き換えるためには前に##を付ける必要があります
マクロの定義が1行を超えると、末尾に「」を付けると、次の行もマクロ定義の範囲内にあることを示します.
最後の行に「」を付ける必要はありません.
 
コードで呼び出す方法について説明します.
これはクラスの声明にあります.
#import "Singleton.h"

@interface SoundTool : NSObject

//  
singleton_interface(SoundTool)

@end

これはクラスのインプリメンテーションファイルです.
クラスの初期化に必要な操作はinitメソッドで実現できます.
@implementation SoundTool

singleton_implementation(SoundTool)

- (id)init
{

}

@end