Управление памятью для программно созданных viewControllers - PullRequest
0 голосов
/ 09 февраля 2012

Я понимаю, что есть много вопросов, похожих на этот, но просмотрев довольно много из них, мне все еще не хватает уверенности, чтобы знать, правильно ли то, что я делаю.Я прошу прощения, если этот вопрос является излишним, однако я бы очень хотел сказать, не является ли то, что я делаю, плохой практикой ...

Чтобы подвести итог, я делаю приложение, похожее на инструментПросто для моего тестирования.Внизу есть UIToolbar с кнопкой.С точки зрения поведения, когда пользователь нажимает кнопку, он открывает небольшое подпредставление в середине экрана.По сути, это подпредставление настроек, где пользователь может переключать некоторые настройки.Если пользователь снова нажимает кнопку панели инструментов, он должен закрыть подпредставление настроек.

В любом случае код выглядит следующим образом:

//Interface
@interface ViewController : UIViewController
{
    SettingsViewController *settingsViewController;
}
@property(retain, nonatomic) SettingsViewController *settingsViewController;

А вот реализация:

//Implementation
-(IBAction)changeSettings:(id)sender
{
    if(!settingsViewController)
    {
        settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil]; 

       //Do some stuff here with CGRect to put the subview in the center of the view

        [self.view addSubview:settingsViewController.view];
    }
    else
    {
        [settingsViewController.view removeFromSuperview];
        [settingsViewController release];
        [self setSettingsViewController:nil];
    }
}

На самом деле, сейчас с этим кодом происходит сбой, когда я пытаюсь закрыть подпредставление (например, когда код попадает в приведенный выше оператор else, он падает).

Глядя на вышекод, я подумал, что сохранение может выглядеть следующим образом:

  • @ свойство сохранить в settingsViewController (сохранить 1)
  • после alloc в settingsViewController (сохранить 2)
  • после addSubview: settingsViewcontroller.view (сохранить 3)

Я думаю, что я здесь что-то не так делаю.Точнее, я знаю, что это так, потому что он падает.

Я действительно надеюсь, что это хороший вопрос.По сути, я хотел бы знать, как справиться с такой ситуацией.Я программно выделяю viewcontroller, а также делаю addSubiew, но я хотел бы сохранить ссылку на объект, так как он мне нужен в другом месте кода.Каков будет правильный способ справиться с этим?

Спасибо!

1 Ответ

1 голос
/ 09 февраля 2012

Проблема в том, что вы слишком много раз выпускаете settingsViewController.

if(!settingsViewController)
{
    settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
    // [settingsViewController retainCount] should now equal 1

    [self.view addSubview:settingsViewController.view];
}
else
{
    [settingsViewController.view removeFromSuperview];

    [settingsViewController release];
    // [settingsViewController retainCount] should now equal 0

    [self setSettingsViewController:nil];
    // [settingsViewController retainCount] should now equal -1. This is most
    // likely causing your crashes.
}

Используйте

[settingsViewController release];
settingsViewController = nil

или используйте:

[self setSettingsViewController:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...