單例(singleTon)

weixin_34189116發表於2017-03-17

單例

單例模式的意圖就是使得類中的一個物件成為系統中的唯一例項。它提供了對類的物件所提供的資源的全域性訪問點。因此需要用一種只允許生成物件類的唯一例項的機制。下面讓我們來看下單例的作用:
可以保證的程式執行過程,一個類只有一個示例,而且該例項易於供外界訪問,從而方便地控制了例項個數,並節約系統資源。

  • 單例模式的使用場合
    類只能有一個例項,並且必須從一個為人數值的訪問點對其訪問。
    這個唯一的例項只能通過子類化進行擴充,並且擴充的物件不會破壞客戶端程式碼。

單例的實現

SingleTonTest.h中
#import <Foundation/Foundation.h>

  @interface SingleTonTest : NSObject

  //單例中的屬性
  @property(nonatomic,copy)NSString *sendStr;
  @property (strong, nonatomic)   NSMutableArray  *arrayM;

  +(SingleTonTest *)sharedSingleTon;

  @end

SingleTonTest.m中
#import "SingleTonTest.h"

 static SingleTonTest *singleTon = nil;

 @implementation SingleTonTest

//經典方式
//+(SingleTonTest *)currentUser
//{
//    if(singleTon == nil){
//        
//      singleTon = [[self.class alloc]init];
//        
//    }
//    return singleTon;
//}


//GCD方式(建議使用)
+(SingleTonTest *)sharedSingleTon{

    static dispatch_once_t onceTocken;
    dispatch_once(&onceTocken,^{
    
    if (!singleTon) {
        singleTon = [[SingleTonTest alloc]init];
    }
});

return singleTon;
}

//重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新例項的時候不產生一個新例項,
+(id)allocWithZone:(NSZone *)zone{

@synchronized(self){
    
    if (!singleTon) {
        
        singleTon = [super allocWithZone:zone]; //確保使用同一塊記憶體地址
        return singleTon;
    }
    return nil;
}
}

//自定義初始化方法
 - (instancetype)init
{
    self = [super init];
    if(self){
        self.sendStr = @"Singleton";
        self.arrayM = [[NSMutableArray alloc] init];
    }
    return self;
 }

 //重寫該方法主要確保當使用者通過copy方法產生物件時物件的唯一性
- (id)copy
{
     return self;
 }    
  //重寫該方法主要確保當使用者通過mutableCopy方法產生物件時物件的唯一性
 - (id)mutableCopy
{
    return self;
}
@end

相關文章