iOSでの単一設計モード

4975 ワード

単例モードとは?
単例モードは一般的なソフトウェア設計モードである.単一のインスタンスモードにより、システム内の1つのクラスに1つのインスタンスしかないことを保証し、そのインスタンスが外部にアクセスしやすく、インスタンスの個数の制御を容易にし、システムリソースを節約できることを保証することができる.
なぜ単例モードを使用するのですか?
システム内のクラスのオブジェクトが1つしか存在しないことを望む場合は、単一のモードが最善の解決策です.
単例モードの使用方法
単例モードは に分けることができ、iOSでは をよく使用しています.次に、日常開発で単例モードをどのように運用するかを見てみましょう.
  • 第1の書き方:
    + (id)sharedInstance {
        static testClass *sharedInstance = nil;
        
        //                  ,       
        @synchronized(self) {
            if (!sharedInstance) {
                sharedInstance = [[self alloc] init];
            }
        }
        
        return sharedInstance;
    }
    
  • 第2の書き方:
    + (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;
    }
    
  • 注意:同時に、copyWithZone、mutableCopyWithZone、非ARCの方法release、retain、retainCountも書き換えます.
    単一マクロの抽出
    単例モードは我々の日常開発で使用頻度が非常に高いため,コードの多重性を高めるために,単例モードのコードを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```