2012-05-01 1 views
0

Моя команда и я работаем над приложением викторины, и у нас есть 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; 

}

+0

«Без эффекта», вы имеете в виду, что, что бы вы ни делали, код все еще не срабатывал одинаково? Можете ли вы - завтра, если нужно, - опубликовать фактический код, который терпит неудачу, и точную ошибку, которую вы получаете? –

+0

Я имею в виду, что это не повлияло на очистку проекта или запуск его на реальном iPad-устройстве. И да, это все еще не получилось. Хорошо, я сделаю это, но просто чтобы дать мне некоторую надежду: можно ли сбросить приложение по коду? Или каким-то образом нажимать на мешковину? – oybcs

+1

Скорее всего, в вашей программе есть ошибка (или, по крайней мере, некоторый код, предполагающий, что он только один раз вызывается); попытка сброса приложения кажется неправильным решением здесь. –

ответ

3

Там не является сборщиком мусора на iOS - есть либо ручной, либо автоматический подсчет ссылок (ARC). В любом случае объекты подсчитываются с помощью сохранения и освобождения. С помощью ARC вам не нужно самостоятельно выполнять эти вызовы, но это не значит, что вы все еще не можете столкнуться с проблемами.

Без вашего кода или информации я могу дать общий совет. Я предполагаю, что ваш сбой - EXC_BAD_ACCESS или какой-то эквивалент.

я написал блог, чтобы объяснить эту проблему и как устранить ее

http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

В вашем случае, это то, что я хотел бы сделать

  1. выполнить анализ и исправить все проблемы его flags
  2. Включите зомби и воспроизведите вашу проблему. Если вы разговариваете с объектом зомби, теперь вам будет немного легче увидеть, что происходит.

Если это не удается, включите Debug Malloc и используйте инструменты, связанные с ним в моем блоге, чтобы отладить проблему.

EDIT ОСНОВАНИИ ВОПРОС EDIT:

Вы получаете исключение - в коде, при условии, есть несколько objectAtIndex вызовов - создать точку останова на исключение с помощью инструкции здесь:

http://www.dosomethinghere.com/2011/04/18/xcode-4-exception-breakpoint/

И скажите нам точную строку.

В принципе, вы не можете вызвать objectAtIndex с 0 на пустом массиве - так что вам нужно сначала проверить длину.

+0

Да, я знаю, как я его называю из-за java: P Но я, очевидно, не знал всего остального. Я проверю это завтра, спасибо большое! – oybcs

+0

Привет, код в настоящее время, и, к сожалению, это не было EXC_BAD_ACCESS – oybcs

0

В iOS нет функции сбора мусора.
Вместо этого есть ARC (Automatic Reference Counting)
компании Apple обсуждает ARC здесь: https://developer.apple.com/technologies/ios5/
ARC технология компилятор и использует сохранить счетчики для отслеживания объектов Таким образом, наиболее вероятной причиной аварии приложение получает доступ к освобожденному объект. Это, как правило, приводит к тому, что компилятор предупреждает вас о плохом доступе! В файле заголовка обязательно сохраните свои объекты с помощью
@property (nonatomic, сохранить) Object * myobject;
Надеюсь, это помогло!

+0

Свойство уже установлено на неатомное, сохранить =/ Мой код находится в сообщении сейчас, вы можете проверить его :) – oybcs

 Смежные вопросы

  • Нет связанных вопросов^_^