单例的创建
在 .h 文件中
#import <Foundation/Foundation.h>
@interface SYSingleObject : NSObject
@property (nonatomic,copy) NSString * name;//单例的属性
//创建方法
+(instancetype)sharedInstancetype;
//销毁方法
+(void)tearDown;
@end
在 .m 文件中
这里初始化的时候使用 [[super allocWithZone:NULL]init] 而不用 [[SYSingleObject alloc]init] 的原因: [[SYSingleObject alloc]init] 实际上是完成了两个工作的 alloc 负责给对象分配内存地址,init 负责对象初始化,包括给成员变量初始值。alloc 会默认调用 allocWithZone 去分配内存地址,这样的话如果用户使用 [[SYSingleObject alloc]init] 初始化是没问题的,但是如果使用 allocWithZone 初始化那么单利的创建就会跳过 sharedInstancetype 这一步,所以这里要用 [[super allocWithZone:NULL]init] 封堵在底层
#import "SYSingleObject.h"
static SYSingleObject * sySingleObject = nil;
static dispatch_once_t onceToken;
@implementation SYSingleObject
+(instancetype)sharedInstancetype{
dispatch_once(&onceToken, ^{
sySingleObject = [[super allocWithZone:NULL]init];
});
return sySingleObject;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [self sharedInstancetype];
}
-(id)copy{
return sySingleObject;
}
-(id)mutableCopy{
return sySingleObject;
}
+(void)tearDown{
//只有置成0,GCD才会认为它从未执行过.它默认为0.这样才能保证下次再次调用sharedInstancetype的时候,再次创建对象.
onceToken = 0;
sySingleObject = nil;
}
@end