单例类:
只能拥有一个实例变量的类;为什么需要单例设计?
1.单例设计是用来限制一个类只能创建一个对象,那么此对象的属性可以存储全局共享的数据,实业的类都可以访问设置,此单例类对象中的属性数据.
2.如果一个类创建的时候非常的消耗性能,如果能满足需求的话,这个类可以设置为单例类以节约性能.常用的单例类
[UIApplication sharedApplication]
[NSUserDefaults standardUserDefaults]
[NSBundle mainBundle]
[NSNotificationCenter defaultCenter]
[NSFileManager defaultManager]
- 自定义单例类
1).命名方法:shared+类名
+(instancetype)sharedImageManager
2).
static MCImageManager *manger = nil;
①+ (instancetype)sharedImageManager
{
@synchronized(self)
{//同步锁, 同一个时间,同时调用同一个该方法,有可能创建出不同的对象,所以加一个同步锁
if(manager == nil)
{
manager = [[super allocWithZone:NULL] init];
}
}
return manager;
}
②`+ (instancetype)sharedImageManager
{
//使用GCD去创建单例 在整个软件生命周期中只执行一次
// static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[MCImageManager alloc]init];
});
return manager;
}`
3).重写 alloc /retain/release/autorelease/copy
①重写allocWithZone方法 防止通过alloc方法创建新对象 ,只要调用alloc最终都会调用allocWithZone
- (id)init
{
self = [super init];
if(self)
{
}
return self;
}
+ (id)allocWithZone:(struct _NSZone *)zone
{
return [self sharedImageManager];
}
②MRC下防止对象被 retain/release/autorelease/copy 所以这些方法也需要重写.因为单例类的特点不应该被释放,引用计数也不应该加1
- (id)retain
{
return self;
}
- (oneway void)release
{
//重写release,方法内部没有代码
}
- (id)autorelease
{
return self;
}
//返回1或者返回NSUIntegerMax都行,通过引用计数这个参考标准告诉使用者这个对象是释放不掉的
- (NSUInteger)retainCount
{
return NSUIntegerMax;
}
+ (id)copyWithZone:(struct _NSZone *)zone
{ //只要调用copy就会调用这个方法
return [self sharedImageManager];
}