iOS常用設(shè)計(jì)模式:?jiǎn)卫?/h1>

單例模式介紹:##

單例模式算是設(shè)計(jì)模式中比較簡(jiǎn)單的形式,其意圖是使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例。準(zhǔn)確定義為:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。-《設(shè)計(jì)模式》

單例模式優(yōu)點(diǎn):##

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

單例模式實(shí)現(xiàn):##

先在Singleton.h中聲明Singleton類:

@interface Singleton : NSObject
{

}
+ (Singleton *) sharedInstance;
@end

聲明完了接下來(lái)應(yīng)該去實(shí)現(xiàn),如果了解C++或者看過(guò)C++中單例的實(shí)現(xiàn),會(huì)發(fā)現(xiàn)比較簡(jiǎn)單,這是因?yàn)榭梢詫㈩惖臉?gòu)造函數(shù)聲稱為private(私有)。但在Objective-C中,每個(gè)方法都是公有的,所以需要重載一些基本的對(duì)象分配方法,具體實(shí)現(xiàn)如下:

#import "Singleton.h"

@implementation Singleton
static Singleton *sharedSingleton_ = nil;
+ (Singleton *) sharedInstance
{
  if (sharedSingleton_ == nil)
  {
    sharedSingleton_ = [[super allocWithZone:NULL] init];
  }
  return sharedSingleton_;
}

這里需要說(shuō)明下,為什么用super而不用self?因?yàn)樵趕elf中重載了基本的對(duì)象分配方法,所以需要借助父類(NSObject)的功能,來(lái)處理底層內(nèi)存分配任務(wù)。

+ (id) allocWithZone:(NSZone *)zone
{
  return [[self sharedInstance]];
} 
//重載copyWithZone:(NSZone *)zone,保證不會(huì)返回實(shí)例的副本
- (id) copyWithZone:(NSZone *)zone
{
  return self;
}
- (id) retain
{
  return self;
}
- (NSUInteger) retainCount
{
  return NSUInterMax;
}
- (void) release
{

}
- (id) autorelease
{
  return self;
}
@end

以上是retain、 release和autorelease被重載,確保他們(在ARC模式下)什么都不做,只是返回self。

總結(jié):##

單例模式其實(shí)在Cocoa Touch框架中很常見,比如UIApplication類,在Objective-C中要實(shí)現(xiàn)一個(gè)單例類,大體需要做以下四個(gè)步驟:
1、為單例對(duì)象實(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、copyWithZone方法,用來(lái)保證其他人直接使用alloc和init試圖獲得一個(gè)新實(shí)例的時(shí)候不產(chǎn)生新的。  
4、重寫retain、retainCount、release等方法,確保在ARC模式下什么都不做。

PS:筆試中經(jīng)常會(huì)遇到“怎樣實(shí)現(xiàn)一個(gè)單例”這種問(wèn)題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 單例對(duì)象在程序運(yùn)行過(guò)程中只占一份內(nèi)存。在開發(fā)中經(jīng)常會(huì)用到單例設(shè)計(jì)模式,目的就是為了在程序的整個(gè)生命周期內(nèi),只會(huì)創(chuàng)建...
    CoderXYF閱讀 285評(píng)論 0 0
  • 前言 本文主要參考 那些年,我們一起寫過(guò)的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,538評(píng)論 1 8
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂,是項(xiàng)目中最...
    成熱了閱讀 4,293評(píng)論 4 34
  • 1 場(chǎng)景問(wèn)題# 1.1 讀取配置文件的內(nèi)容## 考慮這樣一個(gè)應(yīng)用,讀取配置文件的內(nèi)容。 很多應(yīng)用項(xiàng)目,都有與應(yīng)用相...
    七寸知架構(gòu)閱讀 6,885評(píng)論 12 68
  • 一、設(shè)計(jì)模式的分類 總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者...
    RamboLI閱讀 772評(píng)論 0 1