單例模式是ios常用設計模式中的一種。單例設計模式的作用是使得這個類的乙個物件成為系統中的唯一例項,因此需要用一種唯一的方法去建立這個物件並返回這個物件的位址。那麼,我們何時使用單例模式呢?1、類只能有乙個例項,而且必須從乙個為人熟知的訪問點對其訪問。2、這個唯一的例項只能通過子類化進行擴充套件,而且擴充套件的物件不會破壞客戶端**。
那麼用objective-c如何實現單例模式呢?下面我們來新建乙個singleton類,在singleton.h中實現如下
@inte***ce singleton : nsobject
+ (singleton *) sharedinstance;
@end
在singleton.m
@implementation singleton
static
singleton * sharedsingleton =nil;
+ (singleton *) sharedinstance
return sharedsingleton;
} @end
這樣就建立乙個簡單的單例模式,實際上有一部分程式設計師也是這樣實現的,但實際上這是乙個不「嚴格」版本,在實際中使用,可能會遇到發起呼叫的物件不能以其他分配方式例項化單例物件,否則,就會建立多個例項。(之前有人和我討論過這個問題,說使用者應該嚴格按照介面來使用,當實際上singleton是乙個物件,我們不能保證使用者不會使用其他的方法去建立(比如alloc),這個時候他就會建立多個例項,這樣就會出現這些無法感知的bug)
下面我對singleton.m的進行改進
@implementation singleton
static
singleton * sharedsingleton =nil;
+ (singleton *) sharedinstance
return sharedsingleton;
} + (id)allocwithzone:(struct
_nszone *)zone
- (id)copywithzone:(nszone *) zone
- (id) retain
- (nsuinteger) retaincount
- (void) release
- (id) autorelease
@end
也許你注意到了,我過載了allocwithzone:,保持了從sharedinstance方法返回的單例物件,使用者哪怕使用alloc時也會返回唯一的例項(alloc方法中會先呼叫allocwithzone:建立物件)。而retain等記憶體管理的函式也被過載了,這樣做讓我們有了把singleton類變得「嚴格」了。
iOS設計模式之單例模式
單例模式 總是返回自己的同乙個例項,它提供了對類的物件所提供的資源的全域性訪問點,並且返回的例項只能被例項化一次.單例設計模式設計需要考慮的兩個問題 1 發起呼叫的物件不能以其他分配方式例項化單例物件,否則,就有可能建立單例類的多個例項 2 對單例物件例項化的限制應該與引用計數記憶體模型共存.sin...
iOS設計模式之單例模式
原則上,單例是在程式生命週期裡只被例項化過一次的 類。為了確保這一點,我們利用類的乙個靜態方法來生成和訪問物件。因此,你是通過以便利方法來訪問某個類的單例物件的,而不是用 alloc init或者靜態autorelease初始化方法。在很多時候,我們使用乙個某個類的唯一例項。最常見的就是乙個程式的主...
iOS設計模式之單例模式
單例模式是ios常用設計模式中的一種。單例設計模式的作用是使得這個類的乙個物件成為系統中的唯一例項,因此需要用一種唯一的方法去建立這個物件並返回這個物件的位址。那麼,我們何時使用單例模式呢?1 類只能有乙個例項,而且必須從乙個為人熟知的訪問點對其訪問。2 這個唯一的例項只能通過子類化進行擴充套件,而...