IOS中单例的设计

2025-10-27 06:30:29

1、单例模式的作用

可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问;

从而方便地控制了实例个数,并节约系统资源

2、单例模式的使用场合

在整个应用程序中,共享一份资源(这份资源只需要创建初始化 1 次)

3、单例模式在 ARC\MRC 环境下的写法有所不同,需要编写 2 套不同的代码

4、3.1 可以用宏判断是否为 ARC 环境

#if __has_feature(objc_arc)

// ARC

#else

// MRC

#endif

IOS中单例的设计

5、3.2 ARC中,单例模式的实现

(1)在.m中保留一个全局的static的实例

static id _instance;

(2)重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)

+ (id)allocWithZone:(struct _NSZone *)zone

{

    @synchronized(self) {

        if (!_instance) {

            _instance = [super allocWithZone:zone];

        }

    }

    return _instance;

}

(3)提供1个类方法让外界访问唯一的实例

+ (instancetype)sharedDemo

{

    @synchronized(self) {

        if (!_instance) {

            _instance = [[self alloc] init];

        }

    }

    return _instance;

}

IOS中单例的设计

6、3.3 非ARC中(MRC),单例模式的实现(比ARC多了几个步骤)

(1)实现内存管理方法

- (id)retain { return self; }

- (NSUInteger)retainCount { return 1; }

- (oneway void)release {}

- (id)autorelease { return self; }

IOS中单例的设计

7、具体实现

8、4.1新建一个项目,名为“单例设计模式”

IOS中单例的设计

9、4.2新建一个名为“SingletonDemo”的类,继承自“NSObject”

IOS中单例的设计

IOS中单例的设计

IOS中单例的设计

10、4.3在类的头文件中设计一个创建单例对象的类方法:

+ (instancetype)sharedSingletonDemo;

IOS中单例的设计

11、4.4在类的.m文件中实现相应的方法

#import "SingletonDemo.h"

@implementation SingletonDemo

// 定义一个全局的static的实例

static id _instance;

/**

 *  重写allocWithZone:方法,在这里创建唯一的实例

 */

+ (id)allocWithZone:(struct _NSZone *)zone

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [super allocWithZone:zone];

    });

    return _instance;

}

/**

 *  提供一个给外部调用的实例化类方法

 */

+ (instancetype)sharedSingletonDemo

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[self alloc] init];

    });

    return _instance;

}

/**

 *  为了考虑得更全面一些,把copy策略创建对象的方法也重写一遍

 */

+ (id)copyWithZone:(struct _NSZone *)zone

{

    return _instance;

}

@end

IOS中单例的设计

IOS中单例的设计

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
  • 阅读量:92
  • 阅读量:118
  • 阅读量:66
  • 阅读量:78
  • 阅读量:123
  • 猜你喜欢