iOS中的單例模式

什麼是單例模式

  • 單例模式 是一個類在系統中只有一個實例對象。經過全局的一個入口點對這個實例對象進行訪問。在iOS開發中,單例模式是很是有用的一種設計模式。設計模式

  • 能夠保證在程序運行過程,一個類只有一個實例工具


實現單例模式的條件

  • 實現單例模式有三個條件:學習

    1. 類的構造方法是私有的spa

    2. 類提供一個類方法用於產生對象設計

    3. 類中有一個私有的本身對象code

  • 針對於這三個條件,OC中都是能夠作到的對象

    1. 類的構造方法是私有的
      咱們只須要重寫allocWithZone方法,讓初始化操做只執行一次繼承

    2. 類提供一個類方法產生對象
      這個能夠直接定義一個類方法內存

    3. 類中有一個私有的本身對象
      咱們能夠在.m文件中定義一個屬性便可資源


應用場景及注意點

  • 應用場景

    • 某個類常常被使用(節約系統資源)

    • 定義工具類

    • 共享數據

  • 注意點

    • 不要繼承單例類

      • 先建立子類永遠是子類對象

      • 先建立父類永遠是父類對象

  • 單例模式:

    • 懶漢模式 : 第一次用到單例對象的時候再建立

    • 餓漢模式 : 一進入程序就建立一個單例對象

ARC


懶漢模式

#import "Singleton.h"

@implementation Singleton
static id _instance;

/**
 *  alloc方法內部會調用這個方法
 */
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    if (_instance == nil) { // 防止頻繁加鎖
        @synchronized(self) {
            if (_instance == nil) { // 防止建立屢次
                _instance = [super allocWithZone:zone];
            }
        }
    }
    return _instance;
}

+ (instancetype)sharedSingleton{
    if (_instance == nil) { // 防止頻繁加鎖
        @synchronized(self) {
            if (_instance == nil) { // 防止建立屢次
                _instance = [[self alloc] init];
            }
        }
    }
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}
@end

餓漢模式(不經常使用)

#import "HMSingleton.h"

@implementation Singleton
static id _instance;

/**
 *  當類加載到OC運行時環境中(內存),就會調用一次(一個類只會加載1次)
 */
+ (void)load{
    _instance = [[self alloc] init];
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    if (_instance == nil) { // 防止建立屢次
        _instance = [super allocWithZone:zone];
    }
    return _instance;
}

+ (instancetype)sharedSingleton{
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}
@end

GCD實現單例模式

@implementation Singleton
static id _instance;

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

+ (instancetype)sharedSingleton{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}
@end

非ARC

在非ARC的環境下,須要再加上下面的方法:

  • 重寫release方法爲空

  • 重寫retain方法返回本身

  • 重寫retainCount返回1

  • 重寫autorelease返回本身

- (oneway void)release { }
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1;}
- (id)autorelease { return self;}
  • 如何判斷是不是ARC

#if __has_feature(objc_arc)
//ARC環境
#else
//MRC環境
#endif

更多關於iOS學習開發的文章請登錄個人我的博客www.zhunjiee.com,歡迎前來參觀學習

相關文章
相關標籤/搜索