iOS中类单例方法的一种实现

在Cocos2D编程中,很多情况我们需要类只生成一个实例,这称之为该类的单例类.

一般我们在类中这样实现单例方法:

+(instancetype)sharedInstance{
    static Foo *sharedInstance;
    if(!sharedInstance){
        sharedInstance = [Foo new];
    }
    return sharedInstance;
}

注意静态变量sharedInstance也可以放到类外部去.

但是如果是多线程环境中,上述方法并不能一定保证生成唯一实例,你还必须添加同步代码.

一不小心,你写的同步代码有可能就是错的.如果是简单的Cocos2D单线程程序很可能发现不了,如果放到复杂的多线程App中运行可能就会出现莫名其妙的错误.

殊不知Foundation平台中已经提供了简单的解决办法,我们可以这样写:

+(instancetype)sharedInstance{
    static dispatch_once_t once;
    static Foo *sharedInstance;
    dispatch_once(&once,^{
        sharedInstance = [self new];
    });
    return sharedInstance;
}
时间: 2024-08-08 02:21:13

iOS中类单例方法的一种实现的相关文章

ruby学习笔记(8)-"静态方法的4种写法"与"单例方法的2种写法"

#静态方法的4种写法 class Test def Test.StaticMethod1 puts "Test.StaticMethod1" end def self.StaticMethod2 puts "Test.StaticMethod2" end class << Test def StaticMethod3 puts "Test.StaticMethod3" end end class << self def S

iOS设计模式 - 单例

iOS设计模式 - 单例   原理图   说明 1. 单例模式人人用过,严格的单例模式很少有人用过 2. 严格的单例模式指的是无法通过常规的 alloc init 方法来生成对象,派生出来的子类也不能产生出对象,而只能通过单例的方法获取到对象   源码 https://github.com/YouXianMing/iOS-Design-Patterns // // Singleton.h // SingletonPattern // // Created by YouXianMing on 15

实例-一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗?

问题描述 一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗? 通过单例创建一个实例,下次调用实例 和 每次都通过单例方法创建有什么不同? 解决方案 既然是单例,每次调用都使用第一次创建的对象,不会每次都创建. 也许你想说单例和静态方法的区别.单例的对象可以继承,但是静态方法不行. 解决方案二: 一个方法里需要使用单例创建一个实例变量,这个实例变量需要多次使用. 每次使用多用时都用单例创建和第一次使用单例创建一个实例变量,以后直接调用实例变量.这两种方法有什么不同?那个更好 解

Spring中单例bean访问非单例bean的第一种方式:方法注入

方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保 护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象. 方法注入的最好用途之一就是处理单态.无状态对象需要调用非单态.有状 态或者非线程安全对象的情况. 以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单 例bean 的singleton设置为false就可以了.其实不然,大家想,我们创建了一 个单例对象,在此单例对象中所用到的其它bean也只会创建一次--(大多数情 况是这样的

iOS利用单例实现不同界面间的数据传输

  首先写一个单例类,继承NSObject check.h文件中 @property(strong ,nonatomic) UITable * Table; @property(strong ,nonitomic) UITextFiled * Text; +(check*)shareDataModle; check.m中 //定义一个静态的checke类的对象,并赋给一个空值 static check * dataModle = nil; +(check*)shareDataModle { if

php实现跨域提交form表单的方法【2种方法】_php技巧

本文实例讲述了php实现跨域提交form表单的方法.分享给大家供大家参考,具体如下: 有时我们为了网站安全考虑,我们不允许直接跨域提交form表单数据,如果我们自己有这个需求呢?下面我们来介绍两种跨域的方法解决直接跨域问题. 下面我们来看看两种php跨域提交form的方法 一.通过php curl function curlPost($url,$params) { $postData = ''; foreach($params as $k => $v) { $postData .= $k . '

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义         单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示:         Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行

ios-iOS UIViewController 单例及helper class的应用

问题描述 iOS UIViewController 单例及helper class的应用 我按照网上的方式写singleton,每次进到SecondViewController,打印的地址都是同一个,但是为什么界面上的UISwitch都是初始化的?我是进了原来的UIViewController吗?还有人建议写helper class,刚开始接触iOS,不是很明白,有没有Demo或者介绍一下基本原理可以么? 解决方案 界面上的UISwitch并不会感知到你singleton的变化,你需要在页面加载

iOS 使用 dispatch_once 创建线程安全的单例

使用 dispatch_once 创建单例 Creating singletons using dispatch_once 无论喜欢与否,有时你确实需要使用单例.事实上,每一个 iOS 和 Mac OS 应用都至少用到了一个单例:UIApplication 或NSApplication. Love them or loathe them, sometimes you need to have a singleton. In fact every iOS and Mac OS applicatio