0

次のコードは、CSVファイル内のcell.textlabel.textで指定された文字列を検索しようとします

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//create singleton instance
Globals *myGlobals = [Globals sharedGlobals];

//get searchstring form cell
NSString *stringToFind = [self.tableView cellForRowAtIndexPath:indexPath].textLabel.text;

//get Path of csv and write data in string:allLines
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"ITILcsv" ofType:@"txt"];
if(filePath){

    NSString *wholeCSV = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    NSArray *allLines = [wholeCSV componentsSeparatedByString:@"\n"];
    //declaration
    NSArray *currentArray = nil;
    NSString *currentSearchString = nil;

//look for searchstring in 4th line of csv, if found write whole line to a singleton-variable
    for (int i=0 ; i < [allLines count]; i++){

        currentArray = [[allLines objectAtIndex:i] componentsSeparatedByString:@";"];
        currentSearchString = [currentArray objectAtIndex:3];

        if ([stringToFind isEqualToString:currentSearchString]){

            [myGlobals setCurrentLine:currentArray];
        }

    }


}

私の現在のプロジェクトでcsvファイルをかなり使用すると、これは機能するはずですが、関数が呼び出されると、どういうわけかアプリが常にクラッシュします。

たくさんのテストを通して、問題は次の行にあると確信しています。

 currentArray = [[allLines objectAtIndex:i] componentsSeparatedByString:@";"];
        currentSearchString = [currentArray objectAtIndex:3];

プログラムはコメントアウトされたこれらの2行で動作しますが、目的の機能を実装していません;)問題が何であるかわかりませんか?

エラーは「メイン」のSIGABRTです。

みなさん、よろしくお願いします。

4

1 に答える 1

1

currentArrayの要素が3未満で、インデックス3を参照している場合、クラッシュする可能性があります。したがって、その場合、手の届かないインデックスを見つけることができます。

したがって、より良いアプローチは

for (int i=0 ; i < [allLines count]; i++)
{
    currentArray = [[allLines objectAtIndex:i] componentsSeparatedByString:@";"];

    // check and then pick
    if ([currentArray count] > 3)
    {
        currentSearchString = [currentArray objectAtIndex:3];

        if ([stringToFind isEqualToString:currentSearchString])
        {
            [myGlobals setCurrentLine:currentArray];
        }
    }
}
于 2012-08-31T09:26:02.867 に答える