0

やあ

UITableView を介して NSMutableArray からアイテムを削除したいのですが、何かがアプリをクラッシュさせます。クラッシュは " 0 objc_msgSend" です。

ここに私のコードがあります:

- (void)viewDidLoad
{
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    path = [basePath stringByAppendingPathComponent:@"favoris.plist"];
    dict = [[NSArray arrayWithContentsOfFile:path] mutableCopy];
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    [dict removeObjectAtIndex:indexPath.row];

    [self.tableView reloadData];
}

ありがとう

4

1 に答える 1

0

EXEC_BAD_ACCESS は絶対にゾンビが存在することを意味するので、メモリ管理に奇妙なことが起こっていると思います.配列のインスタンス化の方法が原因で発生している可能性があります. Instruments で Zombies ツールを実行すると、より多くの情報が得られますが、次のことを試してみてください。

(別の提案、なぜ NSArray の変数に dict という名前を付けているのですか?)

このコードを試してください:

- (void)viewDidLoad
{
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    path = [[basePath stringByAppendingPathComponent:@"favoris.plist"] retain];
    dict = [[NSMutableArray alloc] initWithContentsOfFile:path];
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    [dict removeObjectAtIndex:indexPath.row];
    [dict writeToFile:path atomically:YES]; 
    [self.tableView reloadData];
}

copyこの提案の根拠は、自動解放されたオブジェクトを呼び出すと予期しない結果が生じるのではないかと私が疑っているということです。

于 2012-11-10T16:17:38.787 に答える