«EXC_BAD_ACCESS», когда я вызываю статическую функцию - PullRequest
0 голосов
/ 16 марта 2011

Рассмотрим эту функцию в классе 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 ]

2 голосов
/ 16 марта 2011

Статические методы не могут получить доступ к нестатическим переменным.

"класс ABC, имеющий одну переменную экземпляра как sName", и поэтому sName недоступен в этом методе.

else if ([name isEqualToString:[obj sName]] == NO)
                                    ^^^^ Error
1 голос
/ 16 марта 2011

Кажется, есть утечка памяти !!!!

Кроме того, если 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 голосов
/ 16 марта 2011

Вот несколько вещей, которые я хотел бы изучить:

  1. второй блок в операторе if выглядит как утечка obj. Если вызывается достаточное количество раз, возможно, вам на самом деле не хватает памяти, и [ABC alloc] фактически начнет возвращать NULL, что приведет к сбою, вероятно, при EXC_BAD_ACCESS отправке сообщения на указатель NULL.

  2. Это выглядит подозрительно похожим на одноэлементный инициализатор. Это не потокобезопасно, поэтому, если вы вызываете его из нескольких потоков, вы можете решить это (кстати, это не тривиальная проблема).

...