iOS高效开发者iOS开发iOS学习

用代码解释为什么要用 '单例'

2017-06-19  本文已影响78人  小浣熊的梦想

在整个工程中(全局)需要使用其它类中的方法时,并且我们需要其它类中的数据(此时不能新创建这个类的对象,否则不能拿到数据),这个时候需要使用单例.

单例的使用

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

上一篇下一篇

猜你喜欢

热点阅读