通过 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:]: 无法识别的选择器发送到实例