如何正确地将单例分配给iOS中的变量?

时间:2016-01-25 09:17:28

标签: ios objective-c singleton

我有一个用Objective-C编写的项目。在其中我使用singleton

其声明是:

+ (id)sharedInstance
{
    static id sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

我在每个使用它的类中初始化它:

singApp = [XXXsingApplication sharedInstance];

当我运行 Xcode Analyzer 时,我得到警告

  

自我'使用的实例变量未设置为结果   ' [(超级或自​​我)初始化......]'

为什么我会收到警告

我想我对问题有一些普遍的误解,因为AFAIK它只有单个实例而且不能再次初始化以避免创建多个实例?

修改

我的init看起来像是:

-(id)init
{
    self = [super init];

    // init read-only values
    _appSwVersion = APP_SOFT_VERSION;
    _appSwDateTime = APP_SOFT_DATETIME;
    _websDns = WEBS_DNS;
    _testWebsUrl = TEST_WEBS_DNS_URL;

    // init properties dictionary
    _propListDict = [[NSMutableDictionary alloc] init];

    @try {

        if (self) {

            // load settings
            [self loadSettingsFromFile];

            // init custom Bundle
            [self setCustomBundle];
        }
    }
    @catch (NSException *exception) {
        NSLog(@"EXCEPTION\nName-> %@\nDescription-> %@", [exception name], [exception description]);
    }

    return self;
}

2 个答案:

答案 0 :(得分:2)

有例外可以捕获编程错误。你不会在Objective-C中捕获和处理异常。当异常发生时,你让它崩溃。这是Objective-C,而不是Java或C ++。您没有处理异常,您修复了代码。

在调用[super init]后,你应该检查self == nil 是否。想想你正在做什么:你正在分配一个实例变量,如果self == nil会导致崩溃。当然,有些人会100%确定自己不能为零。但是后来五行,你检查一下self == nil。这种组合是明确指出错误。如果检查,则必须在分配实例变量之前进行检查。如果您分配给实例变量,则任何检查都为时已晚。

答案 1 :(得分:1)

您的代码应如下所示。

 -(id)init {
    self = [super init];
    @try {

        if (self) {

            // init read-only values
            _appSwVersion = APP_SOFT_VERSION;
            _appSwDateTime = APP_SOFT_DATETIME;
            _websDns = WEBS_DNS;
            _testWebsUrl = TEST_WEBS_DNS_URL;

            // init properties dictionary
            _propListDict = [[NSMutableDictionary alloc] init];
            // load settings
            [self loadSettingsFromFile];

            // init custom Bundle
            [self setCustomBundle];
        }
    } @catch (NSException *exception) {
        NSLog(@"EXCEPTION\nName-> %@\nDescription-> %@", [exception name], [exception description]);
    }

    return self;
}