`
iaiai
  • 浏览: 2213897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dispatch_once和@synchronized的单例模式

 
阅读更多
我们在使用单例的时候往往会使用@synchronized,其实GCD也提供了一种方式。它的优点在于它使用block而非函数指针,这样代码更自然。

我们平时使用的初始化往往是这样的
+ (id)sharedInstance
{
    static Instance *obj = nil;
    @synchronized([Instance class])
    {
        if(!obj)
            obj = [[Instance alloc] init];
    }
    return obj;
}

这样性能就不是很好,因为每次调用+ (id)sharedInstance函数都会付出取锁的代价。下面我们使用更加简洁的方式来实现:
+ (id)sharedInstance
{
    static dispatch_once_t pred;
    static Instance *obj = nil;
    dispatch_once(&pred, ^{
        obj = [[Instance alloc] init];
    });
    return obj;
}

这样的方法有很多优势,首先满足了线程安全问题,其次很好满足静态分析器要求。GCD可以确保以更快的方式完成这些检测,它可以保证block中的代码在任何线程通过dispatch_once调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。

因此,以后我们使用单例模式的时候尽量使用GCD。
分享到:
评论

相关推荐

    IOS单例模式Demo

    单例模式是软件设计模式中的一种,它保证一...了解并熟练运用单例模式,可以帮助你更好地设计和组织iOS应用程序的架构,提高代码的复用性和稳定性。通过分析和研究`Singleton`中的示例,你将对单例模式有更深入的理解。

    OC单例模式讲解

    在Objective-C (简称OC)中,单例模式非常常用,尤其是在需要对资源进行统一管理和控制的场景下。 #### 二、为什么使用单例模式? 1. **节省资源**:通过单例模式可以保证系统内存中该类只存在一个对象,从而避免了...

    ios-简易了解GCD的单例模式.zip

    1. **单例的实现**:通常使用`dispatch_once`或者`@synchronized`来确保单例的线程安全。`dispatch_once`是GCD提供的函数,保证某个代码块只执行一次,适用于初始化单例;`@synchronized`则是Objective-C的关键字,...

    单例模式-ARC

    通过合理使用`dispatch_once`、`weak`引用和`@synchronized`等技术,可以在保证单例模式功能的同时,确保内存的正确管理。无论是在Objective-C还是Swift中,都有多种方式实现单例,开发者可以根据项目需求选择合适的...

    ios应用源码之单例模式 2018127

    单例模式是软件设计模式中的一种,它保证一个类...通过分析和理解单例模式,开发者可以更好地组织代码,提高代码的可维护性和复用性,同时避免资源的浪费。在iOS应用开发中,熟练掌握并合理运用单例模式是非常重要的。

    OC-单例OC-单例OC-单例OC-单例OC-单例

    5. **线程安全**:为了确保在多线程环境中正确地创建和访问单例,可以在`sharedInstance`方法中添加线程同步代码,如使用GCD的`dispatch_once`或者`@synchronized`关键字。 **使用GCD实现线程安全的单例** ```objc ...

    谈一谈iOS单例模式

    4. **使用场景**:单例模式常用于网络请求管理、用户偏好设置、数据库访问、全局配置等需要全局共享和控制单一实例的场景。 5. **注意事项**:虽然单例模式在许多情况下很有用,但也应该谨慎使用,因为它可能导致...

    objective-c单例模式的完整书写方式

    在多线程环境下,可以使用`dispatch_once`或者`@synchronized`来保证单例的线程安全性。 `FullSingleton.h`和`FullSingleton.mm`文件很可能是实现了上述步骤的示例代码,具体实现细节可以通过查看这两个文件了解。...

    细究单例那些你不知道的事(OC).zip

    总结起来,OC中的单例模式涉及了内存管理、线程安全和防止额外实例创建等多个方面。理解并合理运用这些知识,可以帮助我们编写出更高效、更稳定的代码。在实际开发中,应当根据项目需求选择合适的单例实现方式,并...

    iOS单例代码

    在Swift中,实现单例的常见方式是使用`GCD`的`dispatch_once`函数,但现在推荐使用`static`关键字和`lazy`属性来创建线程安全的单例。下面是Swift的单例实现: ```swift class Singleton { static let ...

    iOS 单例模式

    单例模式常用于管理共享资源,如网络连接、偏好设置或者数据库连接,确保这些资源在程序中的统一管理和有效利用。 单例模式的核心特点在于限制类的实例化次数,只允许创建一个对象。这样做的好处是可以避免多个对象...

    iOS单例传值

    虽然上述`dispatch_once`保证了线程安全的实例化,但如果你在多个线程中同时修改单例中的属性,可能需要额外的同步措施,例如使用`@synchronized`关键字。 在“自学项目-单例”这个压缩包中,你可能会找到一个完整...

    IOS应用源码之单例模式 .rar

    这个方法通常使用`dispatch_once`或`synchronized`关键字来确保线程安全,保证单例只被初始化一次。 4. 最后,实现`dealloc`方法来清理可能存在的资源,但在iOS中,由于App的生命周期,单例通常不会被销毁,除非App...

    单例的代码

    单例模式是软件设计模式中的一种,用于控制...在给定的压缩包文件中,包含的`.h`和`.m`文件可能就是实现了上述单例模式的代码。将其导入项目后,你可以直接通过`[SingleTon sharedInstance]`来获取并使用这个单例对象。

    SingletonTest Demo代码

    - **数据库连接**:在多线程环境下,数据库连接通常需要单例模式来确保只有一个连接,便于管理和优化。 - **缓存管理**:全局缓存服务通常由Singleton提供,方便各个组件共享和更新。 - **日志服务**:日志记录服务...

    IOS应用源码——Singleton.rar

    在Objective-C中,单例的实现会稍微复杂一些,通常使用`dispatch_once`或`@synchronized`来保证线程安全: ```objc @implementation AppManager + (instancetype)sharedManager { static AppManager *...

    ios-FMDBsharedInstance 多线程FMDB单例类.zip

    在这个例子中,我们使用了dispatch_once保证了单例的线程安全初始化。每次调用`+sharedInstance`时,只会执行一次初始化代码块。这样,无论应用中有多少个线程尝试获取单例,都只会有一个FMDB实例。 为了在多线程...

    iOS单例的创建与销毁示例

    2. 对于使用`dispatch_once`创建的单例,需要先将`onceToken`设置回0,以便下次调用`sharedInstance`时重新创建单例: ```objc extern dispatch_once_t onceToken; + (void)attemptDealloc { onceToken = 0; //...

    详解IOS 单例的两种方式

    这种方法利用了GCD中的`dispatch_once`函数来确保单例对象只被初始化一次。`dispatch_once`是一个线程安全的函数,它保证了在多线程环境下只会执行一次其传入的Block。 ```objc // .h 文件 @interface RtDataModel ...

    iOS工程师面试题.docx编程资料

    - **代理(delegate):** 通过定义协议(protocol)和委托(delegate)模式,实现接口的复用。 - **类别(category):** 类别允许向现有类添加新的方法而不需修改原类。 - **组合(composition):** 通过对象组合的方式实现...

Global site tag (gtag.js) - Google Analytics