首页 > 代码库 > dispatch_once创建单例
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];的形式创建一个对象,那么就不会共享类方法创建的对象。
dispatch_once创建单例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。