通过 UITableView 从 NSMutableArray 中删除项目

Posted

技术标签:

【中文标题】通过 UITableView 从 NSMutableArray 中删除项目【英文标题】:Delete items from NSMutableArray through UITableView 【发布时间】:2012-11-10 15:01:27 【问题描述】:

我想,但是应用程序崩溃了。 崩溃是“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];

谢谢

【问题讨论】:

嗨,欢迎来到 SO!为了让我们帮助您找出问题所在,如果您发布应用程序崩溃时打印的错误信息,将会非常有帮助。 @lnafziger 好吧,对不起,伙计,我刚刚更新了我的帖子;) 不需要任何借口。如果您发布它打印的 整个 消息,它会更有帮助。 ;) [MyViewController tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath] 还有一个 EXC_BAD_ACCESS 在线:[dict removeObjectAtIndex:indexPath.row]; 另外,正如@Inafziger 所暗示的,它确实看起来像记忆。你能按照这些说明寻找僵尸吗? ***.com/questions/5386160/… 【参考方案1】:

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 会产生意想不到的后果。

【讨论】:

谢谢你,所以现在我的代码在我的tableView:tableView commitEditingStyle:editingStyle forRowAtIndexPath:indexPath 中是:dict = [[NSMutableArray alloc] initWithContentsOfFile:path]; [dict removeObjectAtIndex:indexPath.row]; [dict writeToFile:path atomically:YES]; [self.tableView reloadData]; 它第一次正确删除了该项目,但由于在线EXEC_BAD_ACCESS 而崩溃:[dict removeObjectAtIndex:indexPath.row]; 我觉得你放错地方了。我建议的代码更改位于viewDidLoad 而不是commitEditingStyle 我用完整示例更新了我的答案供您尝试 @obuseme 这两行代码没有区别。最终结果是一个保留的可变数组。 当然有区别。在原始代码中,mutableCopy 命令对自动释放池中的对象调用保留。我的示例删除了自动释放的使用(通过便利构造函数 arrayWithContentsOfFile 发生) 是的,但如果我把它放在viewDidLoad 中,我就没有indexPath.row

以上是关于通过 UITableView 从 NSMutableArray 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

通过 UITableView 从 NSMutableArray 中删除项目

如何通过滑动从 Parse 中的 UITableView 中删除对象?

如何从通过情节提要创建的 UITableView 中提取 UIView?

-[__NSDictionaryI rangeOfString:options:]: 无法识别的选择器发送到实例

使用 NSFetchedResultsController 从 UITableView 中删除

从 NSDate 获取 UITableView 标题