单例问题补充说明

2016-11-15  本文已影响17人  黑羽肃霜

单例模式

我的理解:
单例模式是通过类方法创建一个实例化的对象,这个对象具备共享性和唯一性。
之前一直使用的
[UIApplication sharedApplication].delegate 其实就是Appdelegate的一个单例实现。

创建单例模式的注意点

实际代码及说明

//判断当前类
 NSString *string = (NSString *)center;//center已经定义为本类的全局变量
    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"UserInfoManagerCenter"])

源码

#import "UserInfoManagerCenter.h"
#define SELFCLASS_NAME BaiduLocationTool
#define SELFCLASS_NAME_STR @"UserInfoManagerCenter"

static UserInfoManagerCenter *center = nil;//定义一个全局的静态变量,满足静态分析器的要求

@implementation UserInfoManagerCenter

+ (instancetype)managerCenter {
    static dispatch_once_t predicate;
    //线程安全
    dispatch_once(&predicate, ^{
        center = (SELFCLASS_NAME *)SELFCLASS_NAME_STRY;
        center = [[SELFCLASS_NAME alloc] init];
    });
    
    // 防止子类使用
    NSString *classString = NSStringFromClass([self class]);
    if ([classString isEqualToString: SELFCLASS_NAME_STR] == NO)
        NSParameterAssert(nil);
    
    return center;
}

- (instancetype)init {
    NSString *string = (NSString *)center;
    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:SELFCLASS_NAME_STR]) {
        self = [super init];
        if (self) {
            // 防止子类使用
            NSString *classString = NSStringFromClass([self class]);
            if ([classString isEqualToString:SELFCLASS_NAME_STR] == NO)
                NSParameterAssert(nil);
        }
        return self;
        
    } else
        return nil;
}

@end

结果


------- 下面的结果和上述的代码无关-------
可以看到的是,在不同地方使用单例来实例化,得到的对象,地址是一样的。

2.<UserInfoManagerCenter: 0x7fcd72dbacf0>
2016-04-07 11:36:53.103 SingletonPattern[2623:153276] 3.(null)
2016-04-07 11:36:53.106 SingletonPattern[2623:153276] <UserInfoManagerCenter: 0x7fcd72dbacf0>
上一篇 下一篇

猜你喜欢

热点阅读