2013-04-11 2 views
0

Я создаю проект с Xcode 4.5.1 на OS X 10.8. Конфигурации являются: проекта: Архитектуры: Стандарт (32/64-бит Intel) Base SDK: OS X 10.7 Target Развертывание: 10,7Не удалось скопировать проект Xcode в другую версию OS X

Сначала все идет smoothly.However, когда я скопировать этот проект другому Macbook с Xcode 4.4.1 на OS X 10.7, возникают ошибки времени выполнения.


Конфигурации выше не изменился, и происходит ошибка в методе, который выборки строки конфигурации из файла:

+(NSString *)configValueFromFile:(NSString *)path 
       withParameter:(NSString *)parameter 
{ 
const char *cPath = [path UTF8String]; 
const char *cPara = [[parameter uppercaseString] UTF8String]; 
char buff[CFG_CONFIG_READ_TOOL_BUFFER_LEN]; 
size_t paraLen = [parameter length]; 
size_t lineLen; 
FILE *fileFd = NULL; 
//struct stat dummyFileStat; 
BOOL isValueFound = NO; 

NSString *ret = nil; 

/* open file *//* 
if (0 != stat(cPath, &dummyFileStat)) 
{ 
    NSLog(@"stat() %@: %@", path, [AMCTools strError]); 
    return nil; 
}*/ 


fileFd = fopen(cPath, "r"); 
if(!fileFd) 
{ 
    NSLog(@"fopen() %@: %@", path, [AMCTools strError]); 
    return nil; 
} 

/* read configuration */ 
while((!feof(fileFd)) && (!isValueFound)) 
{ 
    @autoreleasepool { 
     size_t tmp; 

     fgets(buff, sizeof(buff), fileFd); 
     if ('\0' == buff[sizeof(buff) - 1]) 
     { 
      break; 
     } 

     /* get a line */ 
     lineLen = strlen(buff); 
     if ((0 == lineLen) || ('#' == buff[0])) 
     { 
      continue; /* !!!!!!! */ 
     } 

     while(('\n' == buff[lineLen - 1]) || 
       ('\r' == buff[lineLen - 1])) 
     { 
      buff[lineLen - 1] = '\0'; 
      lineLen --; 
     } 

     //NSLog(@"Get line: %s", buff); 

     /* upper case the parameter */ 
     for (tmp = 0; 
      (tmp < lineLen) || ('=' != buff[tmp]); 
      tmp++) 
     { 
      if ((buff[tmp] >= 'a') && (buff[tmp] <= 'z')) 
      { 
       buff[tmp] += 'A' - 'a'; 
      } 
     } 

     /* compare */ 
     if (0 == strncmp(cPara, buff, paraLen)) 
     { 
      isValueFound = YES; 

      /* fetch value sector */ 
      for (tmp = paraLen; tmp < lineLen; tmp++) 
      { 
       if ('=' == buff[tmp]) 
       { 
        tmp++; 
        break; 
       } 
      } // end: for (tmp = paraLen...) 

      if (tmp >= lineLen) 
      { 
       /* no parameter values */ 
       ret = @""; 
      } 
      else 
      { 
       /* skip blank */ 
       for (/**/; tmp < lineLen; tmp++) 
       { 
        if ((' ' != buff[tmp]) && 
         ('\t' != buff[tmp])) 
        { 
         break; 
        } 
       } 
       ret = [NSString stringWithUTF8String:buff+tmp]; 
      } 
     } // end: compare 
    } // end: autoreleasepool 
} //end: while(...) 


ENDS: 
    if (fileFd) 
    { 
     fclose(fileFd); 
    } 
    return ret; 
} 

Этот метод идет хорошо, пока «возвратному РЭТ», который бросает ошибку "Thread 1: сигнал SIGABRT ";


Что мне делать?

Спасибо!


Дополнительная информация для Коди:

  1. О заботу:

О, я забыл упомянуть, что я использовал ARC. Это не должно было быть освобождение.

Вы упомянули о линии:

const char *cPara = [[parameter uppercaseString] UTF8String]; 

Если он не подходит, как я должен исправить это?

+0

Вы уверены, что если вы поместите его в другое место, то этот метод называется вообще? Поместите в него NSLog. И, кстати, если вы используете ARC remove @autoreleasepool block - это немного запутанно. – cody

+0

Извините, я верну свое «последнее испытание». Может быть, это только одна удача или что-то еще. Я попытался прокомментировать авторекламу и добавить NSLog между « fclose()» и « return ret». Он доказал, что «ret» все еще сохраняется во время NSLog(). Но после его возвращения он освобождается, как вы упомянули. –

ответ

0

Хорошо, похоже, что ваше возвращаемое значение было выпущено. Насколько я знаю, stringWithUTF8String: возвращает автореализованную строку. И в вашем случае он находится внутри блока @autoreleasepool. И когда блок заканчивается, возвращается ret, и вы возвращаете некоторый мусор.

Также Я беспокоюсь об этой строке:

const char *cPara = [[parameter uppercaseString] UTF8String]; 

здесь cPara укажет внутри временную строку. Это может быть либо утечка, либо может быть сбой (с ARC). Вы должны хранить заглавную строку в некоторой промежуточной переменной:

NSString uppercaseParam = [parameter uppercaseString]; 
const char* cPara = [uppercaseParam UTF8String]; 


Вы определенно должны взглянуть на ARC - это очень удобная функция.

+0

Спасибо !!!Я опишу свою дополнительную информацию в основном тексте. –

+0

Я попробовал "return [NSString stringWithstring: ret];". Но это тоже не работает. –

+0

Это не главное, с ARC вы не должны копировать возвращаемое значение. Что касается неприемлемой строки: сначала нужно сохранить строку верхнего регистра в некоторый NSString, и только после этого вы можете получить указатель на данные UTF8String, потому что этот указатель будет правильным только в том случае, если существует строчная строка. – cody