用程式碼解釋為什麼要用 '單例'
在整個工程中(全域性)需要使用其它類中的方法時,並且我們需要其它類中的資料(此時不能新建立這個類的物件,否則不能拿到資料),這個時候需要使用單例.
單例的使用
例如:在 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 物件,相當於單例的功能.
這樣完成一次全域性的使用是相當麻煩的,所以單例的使用會很方便的讓我們在全域性使用某個類,這個類的物件只需要建立一次,最好就是建立單例,否則可能會出錯(很可能會重複建立某個累的物件導致拿到的物件不是同一個,造成值傳遞為空的)或者比較繁瑣.
相關文章
- 為什麼要用單例模式?單例模式
- Anaconda大法好,為什麼要用Anaconda(附linux安裝與用例)Linux
- 計算機為什麼要用補碼計算機
- 為什麼要用dockerDocker
- 為什麼要用docker?Docker
- 為什麼要用RedisRedis
- 開發Web應用為什麼要用TypeScript?WebTypeScript
- 為什麼要用混合加密?加密
- 為什麼要用SOCKS代理?
- 漫話:如何給女朋友解釋什麼是單例模式?單例模式
- 請寫出如下程式碼執行的結果並解釋為什麼?[程式碼]
- 為什麼很多基於 python 的自動化測試框架要用 excel 寫用例Python框架Excel
- 我們為什麼要用RedisRedis
- 為什麼要用資料中臺
- 為什麼要用where 1=1
- 為什麼要用Node.jsNode.js
- 為什麼要用工廠模式模式
- 為什麼要用Redis叢集?Redis
- 通過程式碼解釋什麼是API,什麼是SDK?API
- 程式設計師為什麼一定要用Linux?程式設計師Linux
- 程式設計師為什麼一定要用 Linux ?程式設計師Linux
- 判斷如下邊框的顏色,並解釋為什麼[程式碼]?
- 為什麼我要用GoEasy替代WebSocketGoWeb
- Dubbo為什麼要用Go重寫?Go
- Android開發為什麼要用MVP?AndroidMVP
- python為什麼要用執行緒Python執行緒
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- 判斷[].__proto__.__proto__ === {}.__proto__結果並解釋為什麼[程式碼]
- python程式碼是解釋型語言,為什麼還有編譯過程?Python編譯
- Jmeter 本身能錄製指令碼,為什麼還要用 Fiddler 生成指令碼?JMeter指令碼
- 我們為什麼要用英文寫文件?
- springboot為什麼要用延遲匯入?Spring Boot
- PG資料庫為什麼要用autovacuum資料庫
- 解析:為什麼人工智慧要用Python?人工智慧Python
- Java併發程式設計——為什麼要用volatile關鍵字Java程式設計
- 什麼是智慧指標?為什麼要用智慧指標?指標
- 什麼是HTTPS協議?為什麼要用HTTPS協議?HTTP協議
- 為什麼 Vue 中不要用 index 作為 key?(diff 演算法詳解)VueIndex演算法
- 用 JS 程式碼解釋 Java StreamJSJava