iOS單例模式

今天去面試,對方公司給的試卷中有一道題是寫單例模式,面試的時候也問了我單例模式的優缺點。老實說回答得相當不好,對方也指出了我代碼中的不嚴謹。回來自己從新查找了一下資料,重新總結了一下。
主要優點:
1、提供了對唯一實例的受控訪問。
2、由于在系統內存中只存在一個對象,因此可以節約系統資源,對于一些需要頻繁創建和銷毀的對象單例模式無疑可以提高系統的性能。
3、允許可變數目的實例。

主要缺點:
1、由于單利模式中沒有抽象層,因此單例類的擴展有很大的困難。
2、單例類的職責過重,在一定程度上違背了“單一職責原則”。
3、濫用單例將帶來一些負面問題,如為了節省資源將數據庫連接池對象設計為的單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出;如果實例化的對象長時間不被利用,系統會認為是垃圾而被回收,這將導致對象狀態的丟失.

以下是相對嚴謹的做法

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying, NSMutableCopying>
+ (instancetype)sharePerson;
@end
#import "Person.h"

//全局
static Person *_person;

@implementation Person

//初始化方法
- (instancetype)init{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [super init];
    });
    return _person;
}

//單例方法
+ (instancetype)sharePerson{
    return [[self alloc] init];
}

//alloc會調用allocWithZone,確保使用同一塊內存地址
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _person = [super allocWithZone:zone];
    });
    return _person;
}

//copy的時候會調用copyWithZone
- (id)copyWithZone:(NSZone *)zone{
    return _person;
}

+ (id)copyWithZone:(struct _NSZone *)zone{
    return _person;
}

+ (id)mutableCopyWithZone:(struct _NSZone *)zone{
    return _person;
}

- (id)mutableCopyWithZone:(NSZone *)zone{
    return _person;
}
Person *person1 = [[Person alloc]init];
    Person *person2 = [Person sharePerson];
    Person *person3 = [[Person alloc]init];
    Person *person4 = [person3 mutableCopy];
    Person *person5 = [person4 copy];
    NSLog(@"%p %p %p %p %p", person1, person2, person3, person4, person5);
// 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0 0x170001ad0
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡介: 單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統...
    RunnerFL閱讀 649評論 0 0
  • 單例介紹 本文源碼下載地址 1.什么是單例 說到單例首先要提到單例模式,因為單例模式是單例存在的目的 單例模式是一...
    雷鳴1010閱讀 3,546評論 0 19
  • 單例模式作用 可以保證在程序運行過程中,一個類只有一個實例,而且該實例易于供外界使用 從而方便地控制了實例個數,并...
    珍此良辰閱讀 1,363評論 3 8
  • 一. 單例模式簡介 單例模式的作用可以保證在程序運行過程,一個類只有一個實例,而且該實例易于供外界訪問從而方便地控...
    xx_cc閱讀 50,273評論 15 146
  • 吾叔我在珠寶玉石行業混跡十三年,投資收藏過黃蠟石,南紅,戰國紅,和田玉,碧玉,青金石.....還有很多玉種。 談這...
    吾叔閱讀 957評論 0 0