dispatch_once创建单例

单例是开发中使用最常见的一种设计模式,无论创建多少个对象,都返回同一个实例,共享一块内存。OC创建单例,基本上就是定义一个类方法,在里面创建一个 对象,然后返回该对象,下次在创建的时候就会判断是否存在该对象,如果有直接返回,没有则重新创建,当然这个对象是保存在全局静态区的。苹果引入了 GCD,代码量就简化了很多,因此可以使用GCD当中的   void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block) 函数来帮助用户创建一个单例,简单易懂。

//
#import <Foundation/Foundation.h>

@interface Person : NSObject

+ (id)shareInstance;
//+ (id)sharedManager;
@end
//
#import "Person.h"
//static Person *per = nil;

@implementation Person

+ (id)shareInstance
{
    static Person *per = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        per = [[Person alloc] init];
    });
    return  per;

}

/*
+ (id)sharedManager
{
    @synchronized (self){
        if (per == nil) {
            per = [[super allocWithZone:NULL] init];
        }
    }
    return per;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}

- (oneway void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;
}
*/

@end

优点:线程安全,不用写@synchronized,或者NSLock 来保证线程安全。

缺点:如果用户使用Person *per = [[Person alloc] init];的形式创建一个对象,那么就不会共享类方法创建的对象。

时间: 2024-10-17 12:10:11

dispatch_once创建单例的相关文章

IOS 使用dispatch_once 创建单例

+ (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[instantClass alloc] init]; }); return _sharedClient; } IOS 使用dispatch_once 创建单例,码迷,mamicode.co

利用dispatch_once创建单例

利用dispatch_once创建单例 使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法.当Apple引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数. 该函数就是dispatch_once: void dispatch_once( dispatch_once_t *predicate, dispatch_block_t bl

IOS基础学习日志(七)利用dispatch_once创建单例及使用

自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行,还会有更多的更好的方法出现.今天就来简要介绍下如何利用dispatch_once创建单例. 在开发中我们会用到NSNotificationCenter.NSFileManager等,获取他们的实例通过[NSNotificationCenter defaultCenter]和[NSFileManage

使用GCD的dispatch_once创建单例

使用GCD的dispatch_once创建单例 介绍了创建单例的方式,不过后来发现其实在ios 4.0后有更加简单的方式. 就是使用GCD的功能 代码如下: + (instantClass *)sharedClient { static instantClass *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[instantClass al

[iOS dispatch_once创建单例]

自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,创建单例又有了新的方法,那就是使用dispatch_once函数,当然,随着演进的进行,还会有更多的更好的方法出现. 我们先看下函数void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个

ios oc 和 swfit 用dispatch_once 创建单例

网上已经有方法了,我这里就是抄了下,原文链接 http://bj007.blog.51cto.com/1701577/649413 http://blog.csdn.net/u010124617/article/details/28856711?utm_source=tuicool 这里的dispatch_once_t就是一个用于标记的整型,没什么特殊之处. 用dispatch_once实现单例的最大好处就是线程安全!!这个经常会被面试问到,建立数据库和网络操作的单例时,确实存在线程安全问题.

单例模式:dispatch_once创建单例

无论是爱还是恨,你都需要单例. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式. 或者我的理解是: 单例就是类,但是该类只能实例化出一个对象. 尽管这是单例的实际定义,但在Foundation框架中不一定是这样.比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defaultManager和defaultCenter获取.尽管不是严格意义的单例,这些类方法返回一个可

iOS 利用dispatch_once创建单例

无论是爱还是恨,你都需要单例.实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication. 什么是单例呢?Wikipedia是如此定义的: 在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式. 或者我的理解是: 单例是一种类,该类只能实例化一个对象. 尽管这是单例的实际定义,但在Foundation框架中不一定是这样.比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defau

利用GCD的dispatch_once创建单例

1 + (id)sharedWhatever 2 { 3 static dispatch_once_t pred; 4 static Whatever *whatever = nil; 5 dispatch_once(&pred, ^{ 6 whatever = [[self alloc] init]; 7 }); 8 return whatever; 9 } 该方法有很多优势:   1.线程安全   2.很好满足静态分析器要求   3.和自动引用计数(ARC)兼容   4.仅需要少量代码 该方