0

NSMutableArray の特定の場所に文字列を挿入しようとしているので、実行しました [myMutableArray insertObject:newString atIndex:219]; ところで、実行[myMutableArray count]すると 273 が返されるので、十分な要素があることがわかります。ただし、問題は、これを試すたびに NSRangeException が発生することです。奇妙な部分は、ログに記録すると_[myMutableArray class] _NSArrayM が返されることですが、例外が表示されると、[__NSCFString insertString:atIndex:] を呼び出していると表示され、それがエラーの原因です。私は間違いなくinsertObjectを使用していますが、それは間違いなく可変配列です。私の問題が何であるか知っている人はいますか?また、ブレークポイントを使用すると、投稿したコードの最初のビットが強調表示されるため、そこに例外があります。

allIDs = [self allIDs];
[allIDs insertObject:[newStudent idNumber] atIndex:x];

- (NSMutableArray*) allIDs
{
    if (!allIDs) {
        allIDs = [[NSMutableArray alloc] init];
    }

    filePath = [[NSString alloc] init];
    NSError *error;
    filePath = [[self getDocumentDirectory] stringByAppendingPathComponent:@"List of Student IDs"];
    NSString *txtInFile = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUnicodeStringEncoding error:&error];

    if(!txtInFile) {
        return nil;
    }

    NSMutableString *tempName = [NSMutableString string];

    for (int i = 0; i < [txtInFile length]; i++) {

        if ([txtInFile characterAtIndex:i] == '*') {

            [allIDs addObject:tempName];

            tempName = [NSMutableString string];
        } else {
            [tempName appendFormat:@"%c", [txtInFile characterAtIndex:i]];
        }
    }

    return allIDs;
}

そのため、戻って 219 までのすべてのインデックスに挿入するループを実行し、インデックスを出力して、どのインデックスで例外をスローし始めたかを確認しました。

for (int i = 0; i < 219; i++) {
    NSLog(@"%i", i);
    [allIDs insertObject:newStudent.idNumber atIndex:i];
}

何らかの理由で、218 までのすべてを問題なく出力し、801505682082758655 にスキップして、範囲外の例外が発生する前に何度もログに記録しました。

4

2 に答える 2

2

への呼び出しが例外の原因であるとエラーが示している場合、insertString:atIndex:それはその呼び出しであり、 とは何の関係もありませんinsertObject:atIndex:insertString:atIndex:具体的には、NSCFStringを呼び出すときに範囲例外が発生します。したがって、配列とは関係ありません。

クラッシュすると、バックトレースがあります。投稿してください。それには例外も含まれます。同様に、デバッガーで非常に簡単に例外ブレークポイントを作成できます。1 つを設定してから、コードが壊れている場所を確認します。

ARC を使用していない限り、そのコードは非常に漏れやすいものです。ARC を使用している場合でも、いくつかの問題があります。つまり、これは意味がありません:

filePath = [[NSString alloc] init];
filePath = [[self getDocumentDirectory] stringByAppendingPathComponent:@"List of Student IDs"];

する必要はありませんfilePath = [[NSString alloc] init];

于 2013-06-23T17:30:04.117 に答える
-2

あなたの問題は、iOS の基本的なメモリ管理規則に従っていないことだと思います。メソッドでインスタンス化されたオブジェクトをメソッドが返す場合、新しいオブジェクトを受け取ったオブジェクトは、この新しいオブジェクトの唯一の所有者になります。呼び出されるメソッドは、、、、またはallocで始まります。そうでない場合、あなたの場合のように、新しいオブジェクトは現在の自動解放プールに入れられ、誰も新しい所有者にならない場合は、アプリが実行ループに戻ったときに解放されます。 あなたの場合、新しいオブジェクトが解放され、メモリが別のオブジェクト、明らかにオブジェクトで上書きされると思います。(リリースされた) object を呼び出そうとすると、偶然、その場所にあったオブジェクトを呼び出すことができます。newcopymutableCopy
NSStringinsertObject:atIndex:insertString:atIndex:NSString
私の提案は、メソッドallIDsに正しい名前を付けることです。たとえばnewAllIDs、 、もう一度試してください。

于 2013-06-23T17:26:04.813 に答える