用程式碼解釋為什麼要用 '單例'
在整個工程中(全域性)需要使用其它類中的方法時,並且我們需要其它類中的資料(此時不能新建立這個類的物件,否則不能拿到資料),這個時候需要使用單例.
單例的使用
例如:在 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 物件,相當於單例的功能.
這樣完成一次全域性的使用是相當麻煩的,所以單例的使用會很方便的讓我們在全域性使用某個類,這個類的物件只需要建立一次,最好就是建立單例,否則可能會出錯(很可能會重複建立某個累的物件導致拿到的物件不是同一個,造成值傳遞為空的)或者比較繁瑣.
相關文章
- 為什麼要用單例模式?單例模式
- 為什麼要用docker?Docker
- 為什麼要用dockerDocker
- 為什麼要用RedisRedis
- 計算機為什麼要用補碼計算機
- 開發Web應用為什麼要用TypeScript?WebTypeScript
- 為什麼要用SOCKS代理?
- 為什麼要用混合加密?加密
- 單例模式中為什麼用列舉更好單例模式
- Anaconda大法好,為什麼要用Anaconda(附linux安裝與用例)Linux
- 為什麼要用Node.jsNode.js
- 我們為什麼要用RedisRedis
- 為什麼要用Redis叢集?Redis
- 為什麼要用資料中臺
- 為什麼要用 Node.jsNode.js
- 為什麼要用工廠模式模式
- Android 從原始碼的角度分析——為什麼要用newInstance來例項化FragmentAndroid原始碼Fragment
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- 通過程式碼解釋什麼是API,什麼是SDK?API
- 漫話:如何給女朋友解釋什麼是單例模式?單例模式
- Dubbo為什麼要用Go重寫?Go
- 為什麼我要用GoEasy替代WebSocketGoWeb
- 為什麼要用原生 JavaScript 代替 jQuery?JavaScriptjQuery
- 為什麼要用儲存過程儲存過程
- 為什麼我要用C寫遊戲遊戲
- 為什麼很多基於 python 的自動化測試框架要用 excel 寫用例Python框架Excel
- 程式設計師為什麼一定要用Linux?程式設計師Linux
- 程式設計師為什麼一定要用 Linux ?程式設計師Linux
- python為什麼要用執行緒Python執行緒
- Android開發為什麼要用MVP?AndroidMVP
- PG資料庫為什麼要用autovacuum資料庫
- 為什麼要用代理和動態代理
- 什麼是智慧指標?為什麼要用智慧指標?指標
- 為什麼 Vue 中不要用 index 作為 key?(diff 演算法詳解)VueIndex演算法
- 故障診斷為什麼要用深度學習?深度學習
- [問答] 為什麼要用vue-cli3?Vue
- 解析:為什麼人工智慧要用Python?人工智慧Python
- 微服務為什麼一定要用docker微服務Docker