iOS輕松使用單例

一、單例模式:

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

二、單例模式的要點(diǎn):

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

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

1、實(shí)例控制:Singleton 會(huì)阻止其他對象實(shí)例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實(shí)例。 
2、靈活性:因?yàn)轭惪刂屏藢?shí)例化過程,所以類可以更加靈活修改實(shí)例化過程IOS中的單例模式。

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

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

#import <Foundation/Foundation.h>

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

.m

#import "SingletonClass.h"

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

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

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

//4、適當(dāng)實(shí)現(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輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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

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