标签:
1.什么是单例模式?
通俗的说就是:一个类,只能实例化一次
2.什么情况下用单例模式?
①创建实例时会给程序造成资源的浪费,而且实例越多也不好控制。
②不同的线程调用时,可能会引起不同步的现象。
③多个模块之间都要访问的实例
④其他...
3.简单实现
下面以一个Student类来举例说明
@interface Student : NSObject + (instancetype) sharedStudent; @end #import "Student.h" static Student* __stu; @implementation Student + (instancetype)sharedStudent { if (__stu == nil) { __stu = [[Student alloc]init]; } return __stu; } @end
上面这个例子是一个最简单的一个单例实现(只是为了说明什么是单例)
下面提供一个偷懒的方法,也是实际工作中常用的方法,用宏来定义单例的声明与定义
#define SYNTHESIZE_SINGLETON_FOR_HEADER(className) \ + (className *)shared##className; #define SYNTHESIZE_SINGLETON_FOR_CLASS(className) \ + (className *)shared##className { static className *shared##className = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ shared##className = [[self alloc] init]; }); return shared##className; } //使用dispatch_once,这个方法的意思是在应用程序生命周期内,这方法只执行一次,这就是ARC下结合GCD的一个单例的代码
使用时,只需要在头文件中与实现文件中写入对应的代码即可
还拿Student举例说明,这里我将这个宏定义单独放到一个头文件中Singleton.h
#import <Foundation/Foundation.h> #import "Singleton.h" @interface Student : NSObject SYNTHESIZE_SINGLETON_FOR_HEADER(Student); @end #import "Student.h" @implementation Student SYNTHESIZE_SINGLETON_FOR_CLASS(Student); @end
标签:
原文地址:http://www.cnblogs.com/amazinglin/p/4922108.html