在ABC类中考虑这个函数,它有一个实例变量作为sName,我有这个类的静态对象作为obj
+ (ABC*) getInstance : (NSString *) name
{
if(obj == nil)
{
obj = [[ABC alloc] initWithName: name];
}
// checking the name is same or reinitializing it again
else if ([name isEqualToString:[obj sName]] == NO)
{
obj = [[ABC alloc] initWithName: name];
}
return obj ;
}
这段代码在模拟器上完美运行,但是当我在设备上运行它时。这个功能被称为几次,第三次被称为“EXC_BAD_ACCESS”。
可能有什么问题?任何改进代码的建议。
答案 0 :(得分:2)
静态方法无法访问非静态变量。
" ABC类有一个实例变量为sName",因此在此方法中无法访问sName
。
else if ([name isEqualToString:[obj sName]] == NO)
^^^^ Error
答案 1 :(得分:1)
似乎有内存泄漏!!!!
此外,如果sName是一个实例变量,为什么不将它合成为一个属性,然后以不同的方式调用它:
@synthesize sName;
+ (ABC*) getInstance : (NSString *) name
{
if(obj == nil)
{
obj = [[ABC alloc] initWithName: name];
}
// checking the name is same or reinitializing it again
else if (![name isEqualToString:obj.sName])
{
//obj is not nil so if we are creating a new obj we should release the old one
[obj release]
obj = [[ABC alloc] initWithName: name];
}
return obj ;
}
答案 2 :(得分:0)
以下是我要研究的一些事项:
if语句中的第二个块似乎泄漏obj
。如果调用足够多次,也许你实际上内存不足,[ABC alloc]
实际上会开始返回NULL
,这会崩溃,可能是EXC_BAD_ACCESS
向{{1}发送消息指针。
这看起来与单身初始化程序非常相似。它不是线程安全的,所以如果你从多个线程调用它,你可能想要修复它(这不是一个微不足道的问题)。