Проблема с памятью в iPhone OS (более короткая версия) - PullRequest
0 голосов
/ 07 октября 2009

У меня проблема с памятью, которую я не могу понять.

У меня есть одно сводное представление, в котором перечислены некоторые настройки и подробное представление, где вы можете редактировать каждый параметр.

В сводном представлении у меня есть табличное представление, заполненное массивом (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. Согласно руководству по управлению памятью Какао это должно работать.

Самое смешное, что другие части моего кода используют идентичные массивы и передают идентичные объекты без проблем.

Любые подсказки, пожалуйста?

Ответы [ 2 ]

1 голос
/ 18 октября 2009

Статический анализ Clang обнаруживает много ошибок при подсчете ссылок, поэтому вы можете попробовать.

Вы можете запустить его вручную, используя Выполнить -> Построить и проанализировать , или включить его для всех сборок с помощью параметра сборки «Запустить статический анализатор».

Обратите внимание, что этот инструмент в настоящее время поддерживает только C и Objective-C, но не C ++ / Objective-C ++.

0 голосов
/ 07 октября 2009

Трудно определить проблему без полного источника. Некоторые вещи, которые вы можете попробовать:

  • Убедитесь, что свойство settingObject в SettingsDetailViewController.h объявлено как «сохранить». Может быть, вы забыли «сохранить», но выпустили этот экземпляр в методе dealloc?
  • Попробуйте не задавать свойство settingObject в SettingsDetailViewController (и не использовать его ни в каком методе - просто закомментируйте эти разделы). Если это имеет значение, это должно иметь отношение к сохранению / выпуску SettingsDetailViewController этого параметра Object
  • Трассировка «retainCount» объекта settingObject в SettingsDetailViewController (операторы отладчика или NSLog), где вы его используете, и после того, как вы выпустили его в dealloc. Это может дать вам некоторые подсказки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...