我有一个用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;
}
答案 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;
}