iOS單例設計模式

什麼是單例模式:(Singleton)


單例模式的意圖是是的類的對象成爲系統中唯一的實例,提供一個訪問點,供客戶類 共享資源。


什麼情況下使用單例?

1、類只能有一個實例,而且必須從一個爲人熟知的訪問點對其進行訪問,比如工廠方 法。

2、這個唯一的實例只能通過子類化進行擴展,而且擴展的對象不會破壞客戶端代碼。


單例設計模式的要點:

1) 某個類只能有一個實例。

2)他必須自行創建這個對象

3)必須自行向整個系統提供這個實例;

4)爲了保證實例的唯一性,我們必須將

5)這個方法必須是一個靜態類


下面看代碼實現

Tools.h

#import <Foundation/Foundation.h>

@interface Tools : NSObject<NSCopying, NSMutableCopying>
// 一般情況下創建一個單利對象都有一個與之對應的類方法
// 一般情況下用於創建單利對象的方法名稱都以share開頭, 或者以default開頭
+ (instancetype)shareInstance;

@end

Tools.m

#import "Tools.h"

static Tools *_instance = nil;//不能讓外部訪問,同時放在靜態塊中

@implementation Tools

+ (instancetype)shareInstance
{
    if (_instance == nil) {
        _instance = [[self alloc] init];
    }
    return _instance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    /*
    // 當前代碼在多線程中可能會出現問題
    NSLog(@"%s", __func__);
    // 由於所有的創建方法都會調用該方法, 所以只需要在該方法中控制當前對象只創建一次即可
    if (_instance == nil) {
        NSLog(@"創建了一個對象");
        _instance = [[super allocWithZone:zone] init];
    }
    return _instance;
     */
    
    // 以下代碼在多線程中也能保證只執行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[super allocWithZone:zone] init];
    });
    return _instance;
}

// copyWithZone方法用什麼調用? 對象
- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    return _instance;
}

- (oneway void)release
{
    // 爲保證整個程序過程中只有一份實例, \
    在這個方法中什麼都不做
}

- (instancetype)retain
{
    return _instance;
}

- (NSUInteger)retainCount
{
//    return 1;
    // 注意: 爲了方便程序員之前溝通, 一般情況下不會在單例中返回retainCount = 1
    // 而是返回一個比較大得值
    return  MAXFLOAT;
}


@end


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章