iOS-单例模式

何为单例模式,就是说如果在一个应用程序中,如果你想让一个类的实例使用的都是同一个,这时你就把该类设置为单例模式,iOS基础框架中有很多的单例模式类,如NSUserDefault,NSNotificationCenter等都是单例模式的设计。

单例模式的设计准则:

1.通过类方法获取单例实例,

2.必须是原子性的,保证多线程的访问安全

3.定义一个静态的指针变量,它会一直存在整个应用程序的生命周期中,一旦被初始化就会一直指向第一次创建的实例。

头文件:

#import <Foundation/Foundation.h>

@interface SingleInstance : NSObject
+(SingleInstance *)sharedObject;
@end

实现文件:

#import "SingleInstance.h"

//声明一个静态的SingleInstance对象指针,这个指针是静态的,所以会一直存在应用程序的整个生命周期中
static SingleInstance *_shareObject = nil;
@implementation SingleInstance
+(SingleInstance *)sharedObject{

    @synchronized(self) {

    if (_shareObject == nil)//保证静态_shareObject指针只被初始化一次
        _shareObject = [[self alloc] init];
    }

//    GCD模式
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        _shareObject = [[self alloc] init];
//    });

    return _shareObject;
}

-(id)init{
    self = [super init];
    if (self) {
        //单例的成员变量的初始化工作
    }
    return self;
}

@end

使用及结果:

for (int i= 0; i<5; i++) {
        NSLog(@"第%d次输出singleInstance = %@",i,[SingleInstance sharedObject]);
    }

2015-04-02 20:22:30.692 single[644:15707]
0次输出singleInstance = <SingleInstance: 0x7fa310d49a30>

2015-04-02 20:22:30.693
single[644:15707]
1次输出singleInstance = <SingleInstance: 0x7fa310d49a30>

2015-04-02 20:22:30.693
single[644:15707]
2次输出singleInstance = <SingleInstance: 0x7fa310d49a30>

2015-04-02 20:22:30.693
single[644:15707]
3次输出singleInstance = <SingleInstance: 0x7fa310d49a30>

2015-04-02 20:22:30.693
single[644:15707]
4次输出singleInstance = <SingleInstance: 0x7fa310d49a30>

时间: 2024-08-14 00:28:48

iOS-单例模式的相关文章

IOS单例模式

单例模式是一种常见的软件设计模式. 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源. 如果希望系统中某个类的对象只能存在一个,单例模式是最好的解决反感. IOS中最常见的单例就是UIApplication 单例的实现步骤: 1.重写allocWithZone方法 allocWithZone方法是对象分配内存空间时,最终会调用的方法,重写该方法,保证只会分配个内存空间. 2.建立shaerdXXX类方法,便于其他类调用 + (id)all

iOS单例模式(Singleton)

单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 2.单例模式的优点: 1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例. 2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程 iOS中的

iOS 单例模式

设计模式./-->是一种手段,一种工具.可以使代码的写起来更方便1. 代理设计模式(委托设计模式) <1>. 监听器的场合 对象B(保姆)想监听对象A(婴儿)的一些行为 <2>. 通知的场合 对象A(婴儿)发生了一些行为,想通知B(保姆)[B(保姆)为代理对象] <3>. 有些事情,不想自己处理,可以交给别人处理 对象婴儿发生了一些事情,不想自己处理,交给保姆处理 2. 代理设计模式的使用场合 当对象A发生了一些行为,想告知对象B-->[让对象B成为对象A的

iOs 单例模式的定义,实现、步骤

单例模式就是一个类在系统中最多只有一个实例对象,并通过一个全局的入口对这个实例对象进行访问. 对于共享的资源,实现多个对象去封装是不必要的,不光占用系统资源,还有可能造成冲突,所以一般使用单例模式. #import "DSSingletonObject.h" @implementation DSSingletonObject + (DSSingletonObject *)defaultObject { static DSSingletonObject *defaultObjectIns

iOS 单例模式 (设计模式一)

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 主要优点: 提供了对唯一实例的受控访问. 由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能. 允许可变数目的实例. 主要缺点: 由于单利模式中没有抽象层,因此单例类的扩展有

ios单例模式详解

http://blog.csdn.net/a451493485/article/details/8624990 C代码   @implementation AppShareDataManager static AppShareDataManager * shareDataManager = nil; @synthesize theCurrentLanguage; @synthesize presentModalFlag; .......... +(AppShareDataManager *) s

iOS 单例模式实现的两种方式

简述面向对象应用程序中的单例类(singleton class)总是返回自己的同一个实例.它提供了对象所提供的资源的全局访问点.与这类设计相关的设计模式称为单例模式. 用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问. 这个方法应该是静态方法,因为让类的实例去生成另一个唯一实例毫无意义. 2.2 何时使用单例模式(1)类只能有一个实例,并且必须从一个为人熟知的访问点对其进行访问,比如工厂方法: (2)这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码.

iOS 单例模式 学习 &quot;52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码&quot;

百度定义:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 维基百科:在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式. 简单理解:单例模式 是只有有一个实力对象的设计模式 这次 使用 单例 用 gcd 来创建 解释几个关键词 dispatch_once  :这个代码块 在整个应用的生命周期 只执行一次, 并且线程安全(如果被多个线程调用,该函数会同步等待直至代码块完成.gcd的

iOS 单例模式范例

The singleton pattern is useful for creating objects that are shared across the entire application, such as an HTTP client or a notification manager, or objects that may be expensive to create, such as formatters. + (instancetype)sharedInstance { sta

IOS单例模式推荐写法(转载)

1 +(instancetype)sharedUserLoginModel{ 2 3 static YLWUserLoginModel *instance; 4 5 static dispatch_once_t onceToken; 6 7 dispatch_once(&onceToken, ^{ 8 9 instance = [[YLWUserLoginModel alloc]init]; 10 11 }); 12 return instance; 13 14 } 这种写法的好处是: 1. 线