單例類,指在項目中某個類只有一個實例對象可以被外界訪問到。最初的應用是在項目中構建一個數據庫的管理類,因爲多個界面會較頻繁的訪問到數據庫,如果某一個地方進行了操作更新了數據,跳轉到另一個頁面的時候訪問,如果不使用單例,那麼就需要把數據傳過去,這樣在需求數據的頁面多了之後就很亂。如果使用單例,就會有一個整個項目都能訪問到的對象,而且任何時候做出修改,在其他地方訪問都是已修改的。對於操作頻繁但是卻只需要一個的這種角色,可是嘗試使用單例模式構建。
看了一些其他的文章,裏面會說到關於對其他構建對象方式的限制,如:點擊打開鏈接,使得不管用什麼方法構建都是那一個對象,我覺得其實不是很必要,稍微熟悉了單例構建,當你想構建單例對象的時候,就會去調用shareXXX或者defultXXX方法,除非你不想使用單例,纔去調用alloc\init,copy之類的方法。在不限制其他構建對象方法的情況下,使用者可以構建很多的對象,但如果你想使用單例,你就不會去調用那些方法。
1、使用staic 關鍵詞構建:
+(id)shareInstance{
static singleObject *shareObject = nil;
@synchronized(self){
if (shareObject==nil) {
shareObject = [[singleObject alloc]init];
}
}
return shareObject;
}
@synchronized(self)是個線程鎖,保證在多線程情況時,裏面的代碼同時只有一個再執行。而根據static關鍵詞的屬性,shareObject指針不會再被聲明,只會被複制,在第一次構建後,它不再是nil,以致之後再調用這個方法時
if (shareObject==nil) {
shareObject = [[singleObject alloc]init];
}
裏面不會再被執行,都會返回第一次構建的對象。使用shareInstance構建的對象爲同一個。
2、使用dispatch_once:
+(id)shareInstance{
static singleObject *shareObject = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shareObject = [[singleObject alloc]init];
});
return shareObject;
}
dispatch_once保證裏面的代碼只執行一次,而且線程安全。shareObject使用static修飾,保證在第一次之後,shareObject都指向同一個內存地址。