【iOS开发】—— 单例模式

参考文章
[iOS开发]单例模式
iOS—单例模式

什么是单例模式

一个单例类,在整个程序中只有一个实例,这个实例被创建以后,就一直到这个程序(APP)结束后系统才会自动释放这块内存,而且一旦你创建了一个单例类,不论你在多少个界面中初始化调用了这个单例方法取得对象,它们所有的对象都是指向的同一块内存存储空间(即单例类保证了该类的实例对象是唯一存在的一个)。

简单来说就是:保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。

系统提供的单例类举例

  • UIApplication(应用程序实例类)
  • NSNotificationCenter(消息中心类)
  • NSFileManager(文件管理类)
  • NSUserDefaults(应用程序设置)
  • NSURLCache(请求缓存类)
  • NSHTTPCookieStorage(应用程序cookies池)

单例模式使用的时机

当一个类所需要的对象只为一个时,举个例子吧:网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制。

单例模式的优缺点

优点:

  • 在内存中只有一个对象,节省内存空间;
  • 避免频繁的创建销毁对象,可以提高性能;
  • 避免对共享资源的多重占用,简化访问;
  • 为整个系统提供一个全局访问点。

缺点:

  • 不适用于变化频繁的对象;
  • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
  • 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;

举例:

Singleon.h

@interface Singleon : NSObject
+ (instancetype)sharedSingle;
@end

Singleon.m
static Singleon *_instance;
@implementation Singleon
//+ (void)load {
    
    
//    _instance = [[self alloc] init];
//}

+ (instancetype)sharedSingle {
    
    
    NSLog(@"运行");
    return _instance;
}

+ (instancetype)alloc {
    
    
    //如果已经初始化了
    if (_instance) {
    
    
        NSException *exception = [NSException exceptionWithName:@"提示" reason:@"OneTimeClass类只能初始化一次" userInfo:nil];
        [exception raise];
    }
    return [super alloc];
}

ViewController.m

@implementation ViewController

- (void)viewDidLoad {
    
    
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    Singleon* single = [[Singleon alloc] init];
    Singleon* single_one = [[Singleon alloc] init];
    NSLog(@"%@", single);
    NSLog(@"%@", single_one);
}

请添加图片描述

如果在app运行开始时就加载,

+ (void)load {
    
    
    _instance = [[self alloc] init];
}

请添加图片描述

扫描二维码关注公众号,回复: 13413286 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_50990189/article/details/120318342