当我调用静态函数时“EXC_BAD_ACCESS”

时间:2011-03-16 06:03:29

标签: iphone exc-bad-access

在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”。

可能有什么问题?任何改进代码的建议。

3 个答案:

答案 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)

以下是我要研究的一些事项:

  1. if语句中的第二个块似乎泄漏obj。如果调用足够多次,也许你实际上内存不足,[ABC alloc]实际上会开始返回NULL,这会崩溃,可能是EXC_BAD_ACCESS向{{1}发送消息指针。

  2. 这看起来与单身初始化程序非常相似。它不是线程安全的,所以如果你从多个线程调用它,你可能想要修复它(这不是一个微不足道的问题)。