美文网首页
iOS 单例

iOS 单例

作者: 光之盐汽水 | 来源:发表于2018-06-22 11:31 被阅读0次

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

相关文章

网友评论

      本文标题:iOS 单例

      本文链接:https://www.haomeiwen.com/subject/bgfkyftx.html