【发布时间】:2009-10-07 01:42:33
【问题描述】:
我正面临某种我无法弄清楚的与内存相关的问题。
我有一个列出一些设置的摘要视图和一个可以编辑每个设置的详细视图。
在摘要视图中,我有一个由设置数组 (settingArray) 填充的表格视图,而这些设置又从核心数据存储库加载。
// SettingsViewController.h
@interface SettingsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
NSMutableArray *settingArray;
}
@property (nonatomic, retain) NSMutableArray *settingArray;
// SettingsViewController.m
- (void)viewWillAppear:(BOOL)animated {
[self setSettingArray:[DataHelper searchObjectsInContext:@"Sections" :nil :@"Id" :YES :managedObjectContext]];
}
这个 NSManaged 对象数组用于为自定义 UITableViewCell 赋值,该 UITableViewCell 有两个标签:标题和描述。
// SettingsViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[…]
[cell.titleLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Title"]];
[cell.descriptionLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Description"]];
[…]
}
当用户点击一行时,这会加载一个详细视图,您可以在其中编辑值并将它们保存到数据库中。摘要视图向详细视图传递 NSManagedObject 引用(settingObject),以便了解核心数据数据库中的哪些记录被选中并且必须更新。
// SettingsViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (settingsDetailViewController == nil) {
settingsDetailViewController = [[SettingsDetailViewController alloc] initWithNibName:@"SettingsDetailView" bundle:nil];
}
// Pass corresponding settingArray object to detail view in the settingObject variable
settingsDetailViewController.settingObject = [settingArray objectAtIndex:indexPath.row];
[…]
}
在详细视图中,用户可以修改一些值,然后将修改后的核心数据对象保存在数据库中。
// SettingsDetailViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Update current setting in database
[self.settingObject setValue:[tableView cellForRowAtIndexPath:indexPath].textLabel.text forKey:@"Description"];
}
问题是,一旦在这个 NSManagedObject 的详细视图中更新了值,当重新加载摘要视图中的 tableview 信息时,我会在从 settingArray 读取标签信息的位置得到一个 EXC_BAD_ACCESS。
// SettingsViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[cell.titleLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Title"]];
// HERE IS WHERE THE ERROR OCCURS IN THE SECOND PASS
[cell.descriptionLabel setText:[[settingArray objectAtIndex:indexPath.row] valueForKey:@"Description"]];
[…]
}
我猜这与正在使用的 settingArray 或 settingObject 的释放有关,但我尝试了不同的方法,但还没有解决方案。所有变量都在相应的.h 中声明,属性使用nontoxic 和retain 添加,访问器在.m 中合成,对象在dealloc 函数中释放。根据 Cocoa 内存管理指南,它应该可以工作。
有趣的是,我的代码的其他部分使用相同的数组并毫无问题地传递相同的对象。
有什么提示吗?
【问题讨论】:
-
我知道执行
[DataHelper searchObjectsInContext:@"Sections" :nil :@"Id" :YES :managedObjectContext]是有效的objective-c 语法,但是这很丑。这些参数到底是干什么用的?