在UITableView moveRowAtIndexPath方法期间崩溃

bug*_*hix 3 iphone crash uitableview nsmutablearray ios4

我有一系列字符串,我已经在我的uitableview中显示了.

当我的uitableview启用了编辑时,我正在尝试将一个字符串从第4行移动到第3行,当我调试此代码时,我在代码的索引部分插入对象中获得EXC_BAD_ACCESS.

[myStringsArray insertObject:name atIndex:toIndexPath.row]; 
Run Code Online (Sandbox Code Playgroud)

但是,如果我不调试,只是构建和运行,我打印以下行,然后它崩溃而没有在我的控制台中看到EXC_BAD_ACCESS.

NSLog(@"re-ordered myStringsArray array");
Run Code Online (Sandbox Code Playgroud)

这是我的moveRowAtIndexPath方法的所有代码:

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"MyStrings.plist"]; 

    //re-order array
    NSString *name = [myStringsArray objectAtIndex:fromIndexPath.row];
    [myStringsArray removeObjectAtIndex:fromIndexPath.row];
    [myStringsArray insertObject:name atIndex:toIndexPath.row];

    NSLog(@"re-ordered myStringsArray array");
    if([myStringsArray writeToFile:path atomically: YES]){NSLog(@"write succesful");}
    else {NSLog(@"write failed");}

    [myTable reloadData];
}
Run Code Online (Sandbox Code Playgroud)

任何想法为什么它认为我试图访问不存在的东西?

纠正我,如果我错了,但我的可变数组已经分配,​​如果删除方法有效,为什么插入方法不起作用?

谢谢

Vla*_*mir 5

当你从数组中删除对象时,它会被释放,所以很有可能它的保留计数变为0并且它被取消分配.为避免过早释放,您可以保留并释放您的对象:

NSString *name = [[myStringsArray objectAtIndex:fromIndexPath.row] retain];
[myStringsArray removeObjectAtIndex:fromIndexPath.row];
[myStringsArray insertObject:name atIndex:toIndexPath.row];
[name release];
Run Code Online (Sandbox Code Playgroud)

或者更好地使用内置的NSMutableArray方法来交换你自己发现的对象:

[myStringsArray exchangeObjectAtIndex:fromIndexPath.row withObjectAtIndex:toIndexPath.row];
Run Code Online (Sandbox Code Playgroud)