Моя команда и я работаем над приложением викторины, и у нас есть 1 вид, и мы просто перезагружаем текст на ярлыках и кнопках. Теперь, когда мы запускаем викторину, есть две петли, которые загружают вопросы и ответы из базы данных. В этих циклах мы инициализируем объекты, объявленные в файле .h. Итак, что мы делаем: obj = [[class alloc] initwith: stuff]; Он отлично работает до 6-го раз, когда мы называем метод, в котором находятся 2 петли. Иногда он падает в первом цикле, иногда во втором. Теперь странная часть состоит в том, что если мы дважды назовем этот метод на кнопку «play again», он будет аварийно завершен в третий раз (метод, называемый 6 раз, затем = сбой), поэтому мы подумали, что это имеет какое-то отношение к памяти или так. Мы попытались очистить проект, запустили его на iPad и на симуляторе. Нет эффекта. Ошибка в том, что массив, который мы заполнили в первом цикле, пуст во втором цикле.iOS - Ошибка приложения сбоев Garbagecollector?
Я не могу дать вам код в настоящий момент, но самым простым способом было бы просто сбросить приложение, когда пользователь нажмет кнопку «снова играть». Есть ли простой способ сделать это? Было бы замечательно, если приложение просто закроется и снова откроется с помощью заставки.
Если вы не можете делать какие-либо предложения прямо сейчас, я добавлю codesnipet завтра
Заранее спасибо
Edit: SIGABRT Это сообщение об ошибке: SoccerQuiz [1563: F803] * Нагрузочное приложение из-за неперехваченное исключение 'NSRangeException', причина: '* - [__ NSArrayM objectAtIndex]: индекс 0 за пределы для пустого массива' * Первого стек бросить вызов: (0x159e022 0x172fcd6 0x158ad88 0x4719 0x3455 0x159fe99 0xe21 4e 0xe20e6 0x188ade 0x188fa7 0x188266 0x1073c0 0x1075e6 0xeddc4 0xe1634 0x1488ef5 0x1572195 0x14d6ff2 0x14d58da 0x14d4d84 0x14d4c9b 0x14877d8 0x148788a 0xdf626 0x20ed 0x2055) Terminate называется бросать исключение (lldb)
Мой код:
-(NSMutableArray*) readFromDatabase{
//if modus is true 20 questions will be loaded(untested). we set mds to 10 for now which works for the first 5 times and then crashes the 6th time
int mds = 0;
if (modus)
mds = 20;
else mds = 10;
bool loop = true;
//a_data is the array in which the data object is. it is filled with the questions and answeres
NSMutableArray * a_data = [[NSMutableArray alloc] init];
//check_id is the array in which the question ids from the database are saved
NSMutableArray * check_id = [[NSMutableArray alloc] init];
//ant is the array in which the 4 possible answers are saved.
NSMutableArray *ant = [[NSMutableArray alloc] init];
//in id_frage the id of the question is saved and in frage the question itself
NSString *id_frage = [[NSString alloc] init];
NSString *frage = [[NSString alloc] init];
//in sql_id the statement for the question is saved
NSString *sql_id = [[NSString alloc] initWithFormat:@"select id from QQUESTION where level = %@ order by random() limit 1", difficulty];
//in the method sqlquery we get data from the database
id_frage = [[self sqlquery: sql_id with:@"Q"] objectAtIndex:0];
[check_id addObject:id_frage];
NSLog(@"1");
//we use these loops to read unique question ids from the database, as you can see random questions are loaded from the database (sql_id statement)
for (int z = 0; z < mds; z++)
{
while (loop)
{
for (int y = 0; y <= check_id.count; y++)
{
//this loop checks if the question id is already in check_id
if ([[check_id objectAtIndex:y] isEqualToString:id_frage])
{
id_frage = [[self sqlquery: sql_id with:@"Q"] objectAtIndex:0];
break;
}
else {
//if the id doesnt already exit, it will be added to the check_id array
if (y == check_id.count-1)
{
[check_id addObject:id_frage];
loop = false;
break;
}
}
}
}
loop = true;
id_frage = [[self sqlquery: sql_id with:@"Q"] objectAtIndex:0];
}
NSLog(@"2");
//this loops loads the questions and answers that fit to the question ids
for (int x = 0; x < mds; x++)
{
//sql_q statement for the questions
NSString *sql_q = [[NSString alloc] initWithFormat:@"select TEXT from QQUESTIONTEXT where ID_QUESTION = '%@' and LANGUAGE = '%@'", [check_id objectAtIndex:x], language];
frage = [[self sqlquery:sql_q with:@"Q" ]objectAtIndex:0];
//sql_a statement for the answers
NSString *sql_a = [[NSString alloc] initWithFormat:@"select answer.correct, answertext.text from QANSWER as answer, QANSWERTEXT as answertext where answer.ID_QUESTION='%@' and answer.ID = answertext.ID_ANSWER and answertext.LANGUAGE = '%@'", [check_id objectAtIndex:x], language];
ant = [self sqlquery: sql_a with:@"A"];
//this loop sets the right answer at the first position of the array
for(int a = 0; a<ant.count-1; a++)
{
if([[ant objectAtIndex:a] isEqualToString:@"1"])
{
a++;
NSString *h = [[NSString alloc]initWithFormat:[ant objectAtIndex:1]];
[ant replaceObjectAtIndex:1 withObject:[ant objectAtIndex:a]];
[ant replaceObjectAtIndex:a withObject:h];
a--;
break;
}
}
//this data object 'd' is filled with a question and 4 answers and 10 or 20 will be added to a_data which will be returned
d = [[data alloc] initFrage:frage mitAntwort1:[ant objectAtIndex:1] Antwort2:[ant objectAtIndex:3] Antwort3:[ant objectAtIndex:5] Antwort4:[ant objectAtIndex:7]];
[a_data addObject:d];
}
NSLog(@"3");
return a_data;
}
«Без эффекта», вы имеете в виду, что, что бы вы ни делали, код все еще не срабатывал одинаково? Можете ли вы - завтра, если нужно, - опубликовать фактический код, который терпит неудачу, и точную ошибку, которую вы получаете? –
Я имею в виду, что это не повлияло на очистку проекта или запуск его на реальном iPad-устройстве. И да, это все еще не получилось. Хорошо, я сделаю это, но просто чтобы дать мне некоторую надежду: можно ли сбросить приложение по коду? Или каким-то образом нажимать на мешковину? – oybcs
Скорее всего, в вашей программе есть ошибка (или, по крайней мере, некоторый код, предполагающий, что он только один раз вызывается); попытка сброса приложения кажется неправильным решением здесь. –