2011-03-16 36 views
0

在有一个实例变量作为SNAME类ABC考虑这个功能,我有这个类的静态对象与obj“EXC_BAD_ACCESS”当我调用静态函数

+ (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

你宣布obj为'ABC * obj'吗? – 2011-03-16 06:08:21

+0

另请参阅Varun Chatterji的回答。我想这可能是你的解决方案。 – 2011-03-16 06:22:43

回答

2

静态方法无法访问非静态变量。

“类ABC具有一个实例变量作为sName”,因此sName无法在此方法中访问。

else if ([name isEqualToString:[obj sName]] == NO) 
            ^^^^ Error 
1

似乎有内存泄漏!!!!

而且,如果SNAME是一个实例varaible,你为什么不合成它的属性,然后不同的称呼它:

@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 ; 
} 
+0

伟大的观点。 +1为您的观察。 :) – 2011-03-16 06:23:30

0

这里有几件事情我会去了解一下:

  1. if语句中的第二个块似乎泄漏obj。如果调用足够的时间,也许你实际上用完内存,并且[ABC alloc]实际上将开始返回NULL,这将会崩溃,可能EXC_BAD_ACCESS发送消息到NULL指针。

  2. 这看起来很像一个单身初始值设定项。它不是线程安全的,所以如果你从多个线程调用它,你可能想修复它(这不是一个微不足道的问题)。