單例模式(OC)

1.單例模式的作用
1>可以保證在程序運(yùn)行過程中,一個(gè)類只有一個(gè)實(shí)例,而且該實(shí)例易于供外界訪問 (這個(gè)蘋果系統(tǒng)給我們提供很多單例的形式: 如share開頭的類方法, default開頭的類方法等等)

// 文件管理
    NSFileManager *manager = [NSFileManager defaultManager];
     NSFileManager *manager2 = [NSFileManager defaultManager];
     NSFileManager *manager3 = [NSFileManager defaultManager];
     NSFileManager *manager4 = [NSFileManager defaultManager];
    NSLog(@"\n%@\n%@\n%@\n%@",manager,manager2,manager3,manager4);
// 程序管理
    [UIApplication sharedApplication];
// 設(shè)置(偏好設(shè)置)
    [NSUserDefaults standardUserDefaults];

控制臺(tái)輸出:


Snip20150927_1.png

2> 方便的控制實(shí)例個(gè)數(shù), 并且節(jié)約系統(tǒng)資源

2.單例模式的使用場合
1>資源只需要初始化一次,在程序中,共享一份資源

單例模式的創(chuàng)建過程

1.在ARC中,在.m文件中,保留一個(gè)全局的static的實(shí)例
static id _instance;
2.重寫+ allocWithZone:此方法在調(diào)用alloc時(shí)必會(huì)調(diào)用. 對(duì)于alloc方法,相信大家并不是很陌生, alloc方法,的主要作用就是為了給新創(chuàng)建的對(duì)象分配存儲(chǔ)空間用的.
所以在這里創(chuàng)建唯一的實(shí)例(不過要注意線程安全)[前一段學(xué)習(xí)了 一次性代碼, 將代碼塊放在一次性代碼內(nèi)部,便可以只執(zhí)行一次,也就是只分配了一次性內(nèi)存]

  1. 有人會(huì)說,懶加載也可以,但是懶加載會(huì)造成資源搶奪的問題,為了解決這個(gè)問題,可以添加互斥鎖,用來解決.
// 重寫allocWithZone方法,
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
// 執(zhí)行一次性代碼
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
if (_instance == nil) {
            NSLog(@"我愛你");
            _instance = [super allocWithZone:zone];
        }
    });
// 創(chuàng)建實(shí)例
    return _instance;
}
  1. 提供1個(gè)類方法讓外界訪問唯一的實(shí)例 + shareInstance[方法名必須有意義,見名知意]
// 自定義單例方法
+ (instancetype)shareInstance
{
return [[self alloc]init];
}
  1. 對(duì)于單例,應(yīng)該無論以何種方式創(chuàng)建都應(yīng)該只有一份內(nèi)存的, 對(duì)于ARC的創(chuàng)建的方法還有copy``mutableCopy,但必須遵守協(xié)議<NSCopying,NSMutableCopying> , 執(zhí)行copy,MutableCopy的時(shí)候必定會(huì)執(zhí)行copyWithZone``mutableCopyWithZone
- (id)copyWithZone:(struct _NSZone *)zone
{
    return _instance;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{

    return _instance;
}

MRC創(chuàng)建單例,和ARC基本相同, 只不過ARC是自動(dòng)引用計(jì)數(shù)器, 會(huì)自動(dòng)釋放.MRC必須手動(dòng)釋放內(nèi)存

1.多了一個(gè)new的類方法創(chuàng)建方法:

// 創(chuàng)建方法:new
+ (instancetype)new
{
    return [[self alloc]init];
}

2.多了一個(gè)retain的對(duì)象方法創(chuàng)建方法:

- (instancetype)retain
{
    return _instance;
}
  1. 分配一份內(nèi)存,永遠(yuǎn)不要被release
- (oneway void)release
{
}
  1. 專業(yè)一點(diǎn),讓其返回最大計(jì)數(shù),讓人一看就知道是單例
- (NSUInteger)retainCount
{
    return MAXFLOAT;
}

5.對(duì)象銷毀的時(shí)候,必須調(diào)用dealloc

- (void)dealloc
{
    [super dealloc];
    NSLog(@"被銷毀了");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容