У меня проблема с памятью, которую я не могу понять.
У меня есть одно сводное представление, в котором перечислены некоторые настройки и подробное представление, где вы можете редактировать каждый параметр.
В сводном представлении у меня есть табличное представление, заполненное массивом (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, который имеет две метки: заголовок и описание.
// 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, когда информация табличного представления в сводном представлении перезагружается, я получаю EXC_BAD_ACCESS именно в той точке, где информация метки считывается из settingArray. 1017 *
// 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, свойства добавляются с использованием нетоксичности и сохраняются, методы доступа синтезируются в .m, а объекты освобождаются в функции dealloc. Согласно руководству по управлению памятью Какао это должно работать.
Самое смешное, что другие части моего кода используют идентичные массивы и передают идентичные объекты без проблем.
Любые подсказки, пожалуйста?