0

私のチームと私はクイズ アプリに取り組んでおり、1 つのビューがあり、ラベルとボタンのテキストをリロードするだけです。クイズを開始すると、データベースから質問と回答をロードする 2 つのループがあります。これらのループでは、.h ファイルで宣言されているオブジェクトを初期化します。obj = [[class alloc] initwith:stuff]; 2 つのループがあるメソッドを 6 回目に呼び出すまでは、完全に機能します。最初のループでクラッシュすることもあれば、2 番目のループでクラッシュすることもあります。ここで奇妙な点は、「もう一度再生」ボタンでメソッドを 2 回呼び出すと、3 回目で既にクラッシュすることです (6 回呼び出されたメソッド = クラッシュ)。それで。プロジェクトのクリーンアップを試み、iPad とシミュレーターで実行しました。無効。エラーメッセージは、配列が

現時点ではコードニペットを提供することはできませんが、最も簡単な方法は、ユーザーが「もう一度再生」ボタンを押したときにアプリをリセットすることです。これを行う簡単な方法はありますか?アプリを閉じて、スプラッシュスクリーンで再度開くだけでも問題ありません。

今すぐ提案できない場合は、明日コードニペットを追加します

前もって感謝します

編集: SIGABRT これはエラー メッセージです: SoccerQuiz[1563:f803] * キャッチされない例外 'NSRangeException' が原因でアプリを終了しています。 : (0x159e022 0x172fcd6 0x158ad88 0x4719 0x3455 0x159fe99 0xe214e 0xe20e6 0x188ade 0x188fa7 0x188266 0x1073c0 0x1075e6 0xeddc4 0xe1634 0x1488ef5 0x1572195 0x14d6ff2 0x14d58da 0x14d4d84 0x14d4c9b 0x14877d8 0x148788a 0xdf626 0x20ed 0x2055) terminate called throwing an exception(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;

}

4

2 に答える 2

3

iOS にはガベージ コレクターはありません。手動または自動の参照カウント (ARC) があります。いずれの場合も、オブジェクトは保持と解放を使用して参照カウントされます。ARC を使用すると、これらの呼び出しを自分で行う必要はありませんが、それでも問題が発生しないわけではありません。

コードや情報がなければ、一般的なアドバイスしかできません。あなたのクラッシュは EXC_BAD_ACCESS または同等のものだと思います。

この問題とトラブルシューティング方法を説明するブログを書きました

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

あなたの場合、これは私がすることです

  1. 分析を実行し、フラグが立てられたすべての問題を修正します
  2. ゾンビをオンにして、問題を再現します。ゾンビ オブジェクトと話している場合、何が起こっているのかが少し簡単にわかるはずです。

それでも問題が解決しない場合は、Debug Malloc をオンにして、ブログにリンクされているツールを使用して問題をデバッグしてください。

質問の編集に基づいて編集:

例外が発生しています-提供したコードには、いくつかの objectAtIndex 呼び出しがあります-次の手順を使用して、例外でブレークポイントを作成します。

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

そして正確なラインを教えてください。

基本的に、空の配列に対して 0 を指定して objectAtIndex を呼び出すことはできません。そのため、最初に長さを確認する必要があります。

于 2012-05-01T20:13:21.233 に答える
0

iOSには、ガベージコレクタ機能はありません。
代わりに、ARC(自動参照カウント)があり
ます。AppleはここでARCについて説明しています。https
://developer.apple.com/technologies/ios5/ ARCはコンパイラテクノロジであり、保持カウントを使用してオブジェクトを追跡します。アプリのクラッシュがリリースされたオブジェクトにアクセスしています。これにより、通常、コンパイラがアクセス不良を警告します。ヘッダーファイルで、
@ property(nonatomic、retain)Object*myobjectを使用してオブジェクトを適切に保持するようにしてください。
これがお役に立てば幸いです。

于 2012-05-01T20:15:28.497 に答える