1、单例的使用场景
在整个应用程序中,共享一份资源,一个类只有一个实例,并且提供一个全局的访问入口访问到这个实例。比如:一个应用只有一个用户登陆,可以使用单例存储用户登录成功之后的用户信息。
2、单例的优缺点
优点:
单例可以保证系统中一个类只有一个实例,方便对实例个数的控制并且节约系统资源。
缺点:
单例对象一旦创立,单例对象被存储在静态变量的全局区域,而单例的内存空间只有在应用程序终止之后才会被释放,因此单例对象在闲置时也消耗了系统的内存资源;并且单例对象不能被继承,也不易被重写或扩展等。
3、单例的实现
1、创建一个继承自NSObject的类,并添加需要的属性和方法。
例如:用户信息单例。
#import
@interfaceFiFUser :NSObject
@property (nonatomic, copy) NSString *userId;
@property (nonatomic, copy) NSString *userName;
@property (nonatomic, copy) NSString *account;
@property (nonatomic, copy) NSString *password;
/**
* 单例方法
* @return返回一个共享对象
*/
+ (instancetype)sharedInstance;
//根据字典设置属性
- (void)setPropertyWithDict:(NSDictionary*)dict;
@end
2、实现单例方法
#import "FiFUser.h"
@implementation FiFUser
staticFiFUser*user =nil;
/**
* 单例方法
*/
+ (instancetype)sharedInstance {
static dispatch_once_t oneToken;
dispatch_once(&oneToken, ^{
user= [[superallocWithZone:NULL]init];
});
return user;
}
//重写创建对象空间的方法
+ (instancetype)allocWithZone:(struct_NSZone*)zone {
return [self sharedInstance];
}
//根据字典设置属性
- (void)setPropertyWithDict:(NSDictionary *)dict {
self.userName = [dict objectForKey:@"userName"];
self.userId = [dict objectForKey:@"userId"];
self.account = [dict objectForKey:@"account"];
self.password = [dict objectForKey:@"password"];
}
3、优化单例——重写copy和mutableCopy方法
//重写copy方法
- (instancetype)copy {
return user;
}
//重写mutableCopy方法
- (instancetype)mutableCopy {
return user;
}
4、优化单例——支持MRC
#pragma mark - 支持MRC
#if !__has_feature(objc_arc)
- (instancetype)retain {
return self;
}
- (NSUInteger)retainCount {
return 1;
}
- (instancetype)autorelease {
return self;
}
- (onewayvoid)release {
}
#endif
网友评论