單例模式

這個是從視頻中看來的,現在記錄在這裏 


#import <Foundation/Foundation.h>


@interface Ticket : NSObject


// 實例化票據的單例

+ (Ticket *)sharedTicket;


// 在多線程應用中,所有被搶奪資源的屬性需要設置爲原子屬性

// 系統會在多線程搶奪時,保證該屬性有且僅有一個線程能夠訪問

// 注意:使用atomic屬性,會降低系統性能,在開發多線程應用時,儘量不要資源

// 另外,atomic屬性,必須與@synchronized(同步鎖)一起使用


// 票數

@property (assign, atomic) NSInteger tickets;


@end



#import "Ticket.h"


static Ticket *SharedInstance;


@implementation Ticket


/**

 實現單例模型需要做三件事情

 

 1. 使用全局靜態變量記錄住第一個被實例化的對象

    static Ticket *SharedInstance

 

 2. 重寫allocWithZone方法,並使用dispatch_once_t,從而保證在多線程情況下,

    同樣只能實例化一個對象副本

 

 3. 建立一個以shared開頭的類方法實例化單例對象,便於其他類調用,同時不容易引起歧義

    同樣用dispatch_once_t確保只有一個副本被建立

 

 

 關於被搶奪資源使用的注意事項

 

 在多線程應用中,所有被搶奪資源的屬性需要設置爲原子屬性

 系統會在多線程搶奪時,保證該屬性有且僅有一個線程能夠訪問

 

 注意:使用atomic屬性,會降低系統性能,在開發多線程應用時,儘量不要資源

 另外,atomic屬性,必須與@synchronized(同步鎖)一起使用

 

 */


// 使用內存地址實例化對象,所有實例化方法,最終都會調用此方法

// 要實例化出來唯一的對象,需要一個變量記錄住第一個實例化出來的對象

+ (id)allocWithZone:(NSZone *)zone

{

    // 解決多線程中,同樣只能實例化出一個對象副本

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        SharedInstance = [super allocWithZone:zone];

    });


    return SharedInstance;

}


// 建立一個單例對象,便於其他類調用

+ (Ticket *)sharedTicket

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        SharedInstance = [[Ticket alloc]init];

    });

    

    return SharedInstance;

}


@end



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