在整个工程中(全局)需要使用其它类中的方法时,并且我们需要其它类中的数据(此时不能新创建这个类的对象,否则不能拿到数据),这个时候需要使用单例.
单例的使用
例如:在 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 对象,相当于单例的功能.
这样完成一次全局的使用是相当麻烦的,所以单例的使用会很方便的让我们在全局使用某个类,这个类的对象只需要创建一次,最好就是创建单例,否则可能会出错(很可能会重复创建某个累的对象导致拿到的对象不是同一个,造成值传递为空的)或者比较繁琐.