iOS輕松使用單例

一、單例模式:

單例模式不需要傳遞任何參數(shù),就有效地解決了不同代碼間的數(shù)據(jù)共享問題。單例類是一個非常重要的概念,因為它們表現(xiàn)出了一種十分有用的設(shè)計模式。單例類的應(yīng)用貫穿于整個iOS的SDK中。例如,UIApplication類有一個方法叫sharedApplication,從任何地方調(diào)用這個方法,都將返回與當前正在運行的應(yīng)用程序相關(guān)聯(lián)的UIApplication實例。除了這個,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(應(yīng)用程序設(shè)置) 、NSURLCache(請求緩存)、NSHTTPCookieStorage(應(yīng)用程序cookies池)都是系統(tǒng)單例;單例類保證了應(yīng)用程序的生命周期中有且僅有一個該類的實例對象,而且易于外界訪問。

二、單例模式的要點:

1、某個類只能有一個實例。
2、它必須自行創(chuàng)建這個實例。
3、它必須自行向整個系統(tǒng)提供這個實例。

三、單例模式的優(yōu)點:

1、實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例?!?br> 2、靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程IOS中的單例模式。

四、創(chuàng)建一個單例至少需要四個步驟:

1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設(shè)置成nil。
2、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例。
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實例的時候不產(chǎn)生一個新實例。
4、適當實現(xiàn)copyWithZone。
Demo:創(chuàng)建一個單例類SingletonClass,定義它的屬性和方法。
.h

#import <Foundation/Foundation.h>

@interface SingletonClass : NSObject
@property (assign, nonatomic)int age;//定義一個屬性
//單例方法
+(SingletonClass *)sharedInstance;
@end

.m

#import "SingletonClass.h"

@implementation SingletonClass
//1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設(shè)置成nil,
static SingletonClass *manager = nil;

//2、實現(xiàn)一個實例構(gòu)造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例,
+(SingletonClass *)sharedInstance{
    
    @synchronized(self) {
        if(manager == nil) {
            manager = [[SingletonClass  alloc] init];
        }
    }
    return manager;
}

//3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實例的時候不產(chǎn)生一個新實例,
+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self){
        
        if (!manager) {
            
            manager = [super allocWithZone:zone]; //確保使用同一塊內(nèi)存地址
            
            return manager;
            
        }
        
        return nil;
    }
}

//4、適當實現(xiàn)copyWithZone,確保copy對象也是唯一
- (id)copyWithZone:(NSZone *)zone{
    
    return self;
    
}
//初始化方法,初始化自己的屬性
- (id)init{
    @synchronized(self) {
        
        if (self = [super init]){
            self.age = 10;
            return self;
        }
        
        return nil;
    }
}

@end

使用:#import "SingletonClass.h"

SingletonClass *singleton = [SingletonClass sharedInstance];
singleton.age = 15;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設(shè)計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,548評論 4 34
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,636評論 1 8
  • 1 場景問題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個應(yīng)用,讀取配置文件的內(nèi)容。 很多應(yīng)用項目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,981評論 12 68
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,835評論 18 399

友情鏈接更多精彩內(nèi)容