0

これらのNSRangeExceptionエラー スレッドを多数検索しましたが、質問に対する回答が見つからないようです。これが私のエラーです:

2015-08-15 17:28:43.793 UTK Recruiting[8794:254203] * キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: '* -[__NSArrayI objectAtIndex:]: 境界を超えたインデックス 3 [0 .. 2]' *** 最初のスロー コール スタック:

ここにいくつかのコードがあります。基本的に、ドキュメントのディレクトリを調べて、すべてのファイル名とパスを取得してUITableViewから、セルを選択できるようにファイル名を入力して、そのファイルを電子メールに添付できるようにします。ここに私のコードのいくつかがあります:

ドキュメント ディレクトリを解析し、すべての csv ファイルを対応する配列に配置します。

- (void) refreshTable {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSArray *documentArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil];

    NSArray *csvFiles = [documentArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
        return [evaluatedObject hasSuffix:@".csv"];
    }]];

    self.csvFileNames = (NSMutableArray*) csvFiles;
    self.csvFilePaths = [NSMutableArray arrayWithCapacity:[csvFiles count]];

    for (NSString *fileName in csvFiles) {
        [self.csvFilePaths addObject:[documentsDirectory stringByAppendingPathComponent:fileName]];
    }



    NSLog(@"files array %@", _csvFileNames);
    NSLog(@"files array %@", _csvFilePaths);

これは UITableView コードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSLog(@"count: %lu", (unsigned long)[self.csvFileNames count]);
    return [self.csvFileNames count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellforRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.textLabel.text=[self.csvFileNames objectAtIndex:indexPath.row];

    return cell;
}

cellForRowAtIndexPathコード全体にブレークポイントを配置した後、投稿したコードの最後のメソッドであるメソッドでクラッシュすることがわかりました。cellForRowAtIndexPath メソッドはまったく実行されません。他に注意すべき重要なことは、4 つの csv ファイルがあり、[self.csvFileNames count]正しく番号 4 を与えることです。

コードはインデックス 3 まで実行されるはずですが、そうでない理由がわかりません。

bt すべてのクラッシュ レポート:

  • スレッド#1:TID = 0x56469、0x0000000109200286> libsystem_kernel.dylib __pthread_kill + 10, queue = 'com.apple.main-thread', stop >reason = signal SIGABRT frame #0: 0x0000000109200286 libsystem_kernel.dylib__pthread_kill + 10フレーム#1:0x0000010923342f libsystem_pthread.dylib abort pthread_kill + 90 frame #2: 0x0000000108fa019a libsystem_sim_c.dylib+ 129フレームabort_message + 257 frame #4: 0x0000000108db33d5 libc++abi.dylibA.dylib _objc_terminate() + 103 frame #6: 0x0000000108db0b01 libc++abi.dylibstd::__terminate(void (*)()) + 8 フレーム #7: 0x0000000108db07aa libc++abi.dylib __cxa_rethrow + 99 frame #8: 0x0000000101e4bd2c libobjc.A.dylibobjc_exception_rethrow + 40 フレーム #9: 0x00000001020db41e CoreFoundation CFRunLoopRunSpecific + 654 frame #10: 0x0000000104e74a3e GraphicsServicesGSEventRunModal + 161 フレーム #11: 0x00000001025ab8c0 UI

    • フレーム #12: 0x000000010176311f UTK 採用main(argc=1, argv=0x00007fff5e4a04f8) + 111 at main.m:14 frame #13: 0x0000000108ef8145 libdyld.dylib開始 + 1 フレーム #14: 0x0000000108ef8145 libdyld.dylib`start + 1

    スレッド #2: tid = 0x564a0, 0x0000000109201232 libsystem_kernel.dylib kevent64 + 10, queue = 'com.apple.libdispatch-manager' frame #0: 0x0000000109201232 libsystem_kernel.dylibkevent64 + 10 フレーム #1: 0x0000000108eb376c libdispatch.dylib _dispatch_mgr_invoke + 247 frame #2: 0x0000000108eb3511 libdispatch.dylib_dispatch_mgr_thread + 54

    スレッド #3: tid = 0x564a2, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 フレーム #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    スレッド #4: tid = 0x564a3, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 フレーム #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    スレッド #5: tid = 0x564a4, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 フレーム #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    スレッド #6: tid = 0x564a5, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 フレーム #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

return ステートメントで main.m がクラッシュする:

int main(int argc, char * argv[]) {
@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

更新: 私は他の多くの NSRangeException スレッドを参照してきましたが、これまでのところ運がありません。

4

2 に答える 2

0

もちろん、メインスレッドでクラッシュします-キャッチされない例外です。すべての例外にブレークポイントを追加すると、[self.csvFileNames objectAtIndex:indexPath.row] が強調表示されます。

iOS のプロパティ システムは決して失敗しません。

私が考えることができる唯一の説明は、テーブルビューが作成されている間に配列がnull化/変更されることです。

メソッド refreshTable が呼び出される頻度と場所を確認します。それは一度であるべきです。

また、NSLog を tableView:cellforRowAtIndexPath: に入れて、実行中に配列が変更されていないことを検証することもできません。

別の、しかし珍しい、おそらくありそうにない説明は、変更された NSArray クラスである可能性があります。(たとえば、objectAtIndex: の動作を変更する NSArray のカテゴリ。かつては一般的でした。しかし、NSArray/NSMutableArray カテゴリを追加したかどうかを知っておく必要があります。

メソッド呼び出しの代わりに、キー付き添え字を使用できます。

cell.textLabel.text = self.csvFileNames[indexPath.row];

于 2015-08-20T14:04:23.733 に答える