iOS中單例類的構建

    單例類,指在項目中某個類只有一個實例對象可以被外界訪問到。最初的應用是在項目中構建一個數據庫的管理類,因爲多個界面會較頻繁的訪問到數據庫,如果某一個地方進行了操作更新了數據,跳轉到另一個頁面的時候訪問,如果不使用單例,那麼就需要把數據傳過去,這樣在需求數據的頁面多了之後就很亂。如果使用單例,就會有一個整個項目都能訪問到的對象,而且任何時候做出修改,在其他地方訪問都是已修改的。對於操作頻繁但是卻只需要一個的這種角色,可是嘗試使用單例模式構建。

   看了一些其他的文章,裏面會說到關於對其他構建對象方式的限制,如:點擊打開鏈接,使得不管用什麼方法構建都是那一個對象,我覺得其實不是很必要,稍微熟悉了單例構建,當你想構建單例對象的時候,就會去調用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都指向同一個內存地址。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章