iOS 单例模式

来源:互联网 发布:mac qq接收不了文件 编辑:程序博客网 时间:2024/06/13 05:57

单例模式:

为什么使用单例,单例模式的用途是什么?下面我们举一个例子来诠释一下

举个大家都熟知的例子——Windows任务管理器,如图,我们可以做一个这样的尝试,在Windows任务栏的右键弹出菜单上多次点击启动任务管理器,看能否打开多个任务管理器窗口?通常情况下,无论我们启动任务管理多少次,Windows系统始终只能弹出一个任务管理器窗口,也就是说在一个Windows系统中,任务管理器存在唯一性。为什么要这样设计呢?我们可以从以下两个方面来分析:其一,如果能弹出多个窗口,且这些窗口的内容完全一致,全部是重复对象,这势必会浪费系统资源,任务管理器需要获取系统运行时的诸多信息,这些信息的获取需要消耗一定的系统资源,包括CPU资源及内存资源等,浪费是可耻的,而且根本没有必要显示多个内容完全相同的窗口;其二,如果弹出的多个窗口内容不一致,问题就更加严重了,这意味着在某一瞬间系统资源使用情况和进程、服务等信息存在多个状态,例如任务管理器窗口A显示CPU使用率10%,窗口B显示CPU使用率15%,到底哪个才是真实的呢?这纯属调戏用户,给用户带来误解,更不可取。由此可见,确保Windows任务管理器在系统中有且仅有一个非常重要。


回到实际开发中,我们也经常遇到类似的情况,为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在。


下面单例模式的几种写法:

在这里创建了一个Person类继承与NSObject

.h文件

//  Person.h

//  单例模式 Singleton 

//  Copyright (c) 2014 summer2014mht@sina.com. All rights reserved.


#import<Foundation/Foundation.h>

@interface Person :NSObject

//单例:一个类只有一个实例在外部创建对象时,不能用alloc.(只要alloc.就会在堆区开辟空间,就意味着有多个对象).

//所以我们要提供一个创建对象的方法.而且是一个+号方法

//default, standard, main, shared开头的都是单例

+ (Person *)sharedPerson;

@end


.m文件

//  Person.m

//  单例模式 Singleton 

//  Copyright (c) 2014 summer2014mht@sina.com. All rights reserved.

#import"Person.h"


@implementation Person

/*

//写法一

+ (Person *)sharedPerson

{

//声明为static ,保证该变量在程序运行期间空间都不会回收.而且保证只初始化一次

//单例的空间在程序运行期间都不会回收,所以要谨慎使用单例,否则会造成内存堆积

    static Person *person = nil;

    @synchronized(self){

        if (person == nil) {

            person = [[Person alloc] init];

        }

    }

    return person;

}

*/

//写法二(推荐使用)

+ (Person *)sharedPerson

{

    static Person *person = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        person = [[Personallocinit];

    });

    return person;

}

@end


4 0
原创粉丝点击