单例
单例模式的意图就是使得类中的一个对象成为系统中的唯一实例。它提供了对类的对象所提供的资源的全局访问点。因此需要用一种只允许生成对象类的唯一实例的机制。下面让我们来看下单例的作用:
可以保证的程序运行过程,一个类只有一个示例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
- 单例模式的使用场合
类只能有一个实例,并且必须从一个为人数值的访问点对其访问。
这个唯一的实例只能通过子类化进行拓展,并且拓展的对象不会破坏客户端代码。
单例的实现
SingleTonTest.h中
#import <Foundation/Foundation.h>
@interface SingleTonTest : NSObject
//单例中的属性
@property(nonatomic,copy)NSString *sendStr;
@property (strong, nonatomic) NSMutableArray *arrayM;
+(SingleTonTest *)sharedSingleTon;
@end
SingleTonTest.m中
#import "SingleTonTest.h"
static SingleTonTest *singleTon = nil;
@implementation SingleTonTest
//经典方式
//+(SingleTonTest *)currentUser
//{
// if(singleTon == nil){
//
// singleTon = [[self.class alloc]init];
//
// }
// return singleTon;
//}
//GCD方式(建议使用)
+(SingleTonTest *)sharedSingleTon{
static dispatch_once_t onceTocken;
dispatch_once(&onceTocken,^{
if (!singleTon) {
singleTon = [[SingleTonTest alloc]init];
}
});
return singleTon;
}
//重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例,
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (!singleTon) {
singleTon = [super allocWithZone:zone]; //确保使用同一块内存地址
return singleTon;
}
return nil;
}
}
//自定义初始化方法
- (instancetype)init
{
self = [super init];
if(self){
self.sendStr = @"Singleton";
self.arrayM = [[NSMutableArray alloc] init];
}
return self;
}
//重写该方法主要确保当用户通过copy方法产生对象时对象的唯一性
- (id)copy
{
return self;
}
//重写该方法主要确保当用户通过mutableCopy方法产生对象时对象的唯一性
- (id)mutableCopy
{
return self;
}
@end