用程式碼解釋為什麼要用 '單例'

weixin_34402408發表於2017-06-19

在整個工程中(全域性)需要使用其它類中的方法時,並且我們需要其它類中的資料(此時不能新建立這個類的物件,否則不能拿到資料),這個時候需要使用單例.

單例的使用

例如:在 BTLocationManager.h 中:

+ (instancetype)sharedManager;

.m中:

static BTLocationManager *_instance;
+ (instancetype)sharedManager {
    NSLog(@"_instance=  %@", _instance);
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_instance == nil) {
            _instance = [[self alloc]init];
        }
    });
    return _instance;
}

// startLocate 方法
- (void)startLocate {
        // 定位的方法
}

全域性使用 BTLocationManager 類時,需要使用單例:

用單例呼叫 BTLocationManager 的方法
[[BTLocationManager sharedManager] startLocate];

用程式碼解釋 '單例' 的作用

單例做的事情可以用另一種方式去解釋:如下
在你呼叫 startLocate 這個方法的時候寫一個方法,然後在 BTLocationManager 中呼叫這個方法將 BTLocationManager 這個類建立的物件傳過來,例如:
我在 LBSManager這個類中需要使用到 BTLocationManager 這個類的物件,我需要將這個物件傳遞給 LBSManager ,首先在 BTLocationManager 建立一個物件,同時用全域性變數記錄這個物件(否則出了這個方法就釋放了,在其它的類中就拿不到這個物件了):

BTLocationManager *locationManager = [[BTLocationManager alloc]init];
_locationManager = locationManager;

在 LBSManager.h 類中寫一個方法:

 - (void)handleGlobalLocationManager:(BTLocationManager *)locationManager;

LBSManager.m中實現:

- (void)handleGlobalLocationManager:(BTLocationManager *)locationManager {
    _locationManager = locationManager;
}

然後BTLocationManager中呼叫,將:

LBSManager *lbsManager = [[LBSManager alloc]init];
[lbsManager handleGlobalLocationManager:_locationManager];

這樣就可以在 其LBSManager 類中呼叫 BTLocationManager 的方法了:如下

[_locationManager startLocate];
效果和單例一樣,這只是對單例的解釋

這時就可以在 LBSManager 中使用 BTLocationManager 的物件了,並且在這兩個類中只建立了一次 locationManager 物件,相當於單例的功能.
這樣完成一次全域性的使用是相當麻煩的,所以單例的使用會很方便的讓我們在全域性使用某個類,這個類的物件只需要建立一次,最好就是建立單例,否則可能會出錯(很可能會重複建立某個累的物件導致拿到的物件不是同一個,造成值傳遞為空的)或者比較繁瑣.

相關文章