美文网首页
两种单例的实现方式

两种单例的实现方式

作者: Chivalrous | 来源:发表于2016-08-16 15:25 被阅读23次

    在IOS中单例设计模式有很广泛的用途,它保证一个类只有一个实例,并提供一个访问它的全局访问点,一个app只有一个实列,也就是说他一直存在,除非你手动置空,在内存里面也只会用到一个地址.

    苹果官方提供了很多单列对象供用户使用,例如:

    - UIApplication 类提供了 +sharedApplication 方法创建和获取 UIApplication 单例.
    - NSBundle 类提供了 +mainBundle 方法获取 NSBundle 单例.
    - NSFileManager 类提供了 +defaultManager 方法创建和获得 NSFileManager 单例(使用代理时需要调用 -init 实例化方法来实例化一个新的对象).
    - NSUserDefaults 类提供了 +defaultUserDefaults 方法去创建和获取 NSUserDefaults 单例.
    - NSNotificationCenter 类提供了 +defaultCenter 方法创建和获取 NSNotificationCenter 单例.
    

    我所知道的单例有两种实现方式,根据线程安全的实现来区分的话,一种是使用@synchronized,另一种是使用GCD的dispatch_once函数。

    synchronized线程锁的方式
    +(instancetype)sharedPersonSync{
        static id instance;
        @synchronized(self) {
            if(instance == nil){
                instance = [[self alloc] init];
            }
        }
        return instance;
    }
    
    GCD方式
    +(instancetype)sharedPerson{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[self alloc] init];
        });
        return instance;
    }
    

    Warning:单例虽然可以达到共享传值的目的,但非必要的情况下最好不要使用单例的方式实例化对象.

    相关文章

      网友评论

          本文标题:两种单例的实现方式

          本文链接:https://www.haomeiwen.com/subject/nuupsttx.html