严格单例与弱单例

单例模式是iOS开发中最常用到的模式之一,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。但是单例的优缺点都非常明显。优点是在内存中只有一个实例,减少了内存的开销,能全局共享数据,降低代码耦合;缺点是无法继承,单例创建后内存不能释放。

普通单例

通常很多人写单例的时候只是用GCD创建了一个对象,通过静态变量去引用来实现单例。

 /**静态单例对象 */
static LJManager *defaultManager = nil;

 /**用dispatch_once确保单例对象只被创建一次 */
+ (LJManager *)defaultManager {
     static dispatch_once_t token;
     dispatch_once(&token, ^{
         if(defaultManager == nil) {
             defaultManager = [[self alloc] init];
         }
     });
     return defaultManager;
 }
严格单例

但是这样写并不能保证该类不创建其他的实例。要确保单例类创建出来的实例有且只有一个,就需要用严格单例来实现。

 /**通过重写allocWithZone:方法,保证[[Singleton alloc] init]创建对象时对象的唯一性
  */
+ (id)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t token;
     dispatch_once(&token, ^{
         if(defaultManager == nil) {
             defaultManager = [super allocWithZone:zone];
         }
     });
     return defaultManager;
}
弱单例

虽然通过这种方式使单例对象成为了唯一实例,但是因为单例对象内存不能释放,而有时候我们又并不需要用到单例,比如当用户跳到地图模块的时候,我们会创建一个地图管理的单例,但是当用户退出地图时,这个单例其实就没有用了。这个时候我们就可以通过用弱单例的方式去实现在退出某个模块时释放单例。

 /** 静态单例弱对象 */
static __weak LJManager *defaultManager;
 /** 静态单例对象弱引用一个局部变量,当局部变量释放时,单例所指向的对象就会释放 */
+ (LJManager *)manager {
    LJManager *manager = defaultManager;
    @synchronized (self) {
        if (manager == nil) {
            @synchronized (self) {
                manager = [[self alloc] init];
                defaultManager = manager;
            }
        }
    }
    return manager;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    LJManager *manager = defaultManager;
    @synchronized (self) {
        if (manager == nil) {
            @synchronized (self) {
                manager = [super allocWithZone:zone];
                defaultManager = manager;
            }
        }
    }
    return manager;
}

这时,当用户进入到地图模块时,地图主控制器通过属性去引用单例对象,当用户退出地图时,控制器被释放,属性所引用的单例对象也会被释放。这样就可以实现单例对象内存的释放了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,667评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,156评论 1 32
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,304评论 4 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,032评论 19 139
  • 粗略算了下,来广州也有4月有余。这个城市以它的包容性让我们见到了它的多面性,所以过来广州工作应该也是值得的,不管以...
    路边2C60阅读 706评论 0 0