Я создаю проект с 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 ";
Что мне делать?
Спасибо!
Дополнительная информация для Коди:
- О заботу:
О, я забыл упомянуть, что я использовал ARC. Это не должно было быть освобождение.
Вы упомянули о линии:
const char *cPara = [[parameter uppercaseString] UTF8String];
Если он не подходит, как я должен исправить это?
Вы уверены, что если вы поместите его в другое место, то этот метод называется вообще? Поместите в него NSLog. И, кстати, если вы используете ARC remove @autoreleasepool block - это немного запутанно. – cody
Извините, я верну свое «последнее испытание». Может быть, это только одна удача или что-то еще. Я попытался прокомментировать авторекламу и добавить NSLog между « fclose()» и « return ret». Он доказал, что «ret» все еще сохраняется во время NSLog(). Но после его возвращения он освобождается, как вы упомянули. –