Освобождение «ссылочных» переменных в области видимости метода - PullRequest
1 голос
/ 03 февраля 2010

В target-c (касание какао) у меня есть серия контроллеров UIViewController, между которыми я переключаюсь.

- (void)switchViews:(id)sender
{
    UIButton *button = (UIButton *)sender;
    UIViewController *nextViewController;
    int tag = button.tag;

    switch (tag)
    {
        // -- has already been created
        case kFinancialButton:
            nextViewController = financials;
            break;

        case kSocialButton:
            if (social == nil)
            {
                SocialViewController *socialViewController = [[SocialViewController alloc] initWithNibName:@"SocialViewController" bundle:nil];
                social = socialViewController;
                [socialViewController release];
            }
            nextViewController = social;
            break;

        case kTicketingButton:
            if (ticketing == nil)
            { 
                TicketingViewController *ticketingViewController = [[TicketingViewController alloc] initWithNibName:@"TicketingViewController" bundle:nil];
                ticketing = ticketingViewController;
                [ticketingViewController release];
            }
            nextViewController = ticketing;
            break;
    }

        ///////
------> // -- [button/nextViewController release]????
        ///////

    [self setActiveButton:button];
}

Как вы видите, я назначаю один из контроллеров представления для "nextViewController". Что мне интересно, так это то, нужно ли мне выпускать эту «локальную» переменную или можно оставить ее в покое, поскольку она просто указывает на один из моих контроллеров представления (который я выпускаю в dealloc). Я не думаю, что «тег» должен быть выпущен, так как это «примитив», правильно? Как насчет кнопки? Я не совсем понимаю, что должно и не должно быть выпущено явно, поэтому, возможно, я слишком осторожен. Заранее спасибо.

1 Ответ

1 голос
/ 03 февраля 2010

Как правило, вам нужно только release переменную, которую вы retain 'd init' d или copy 'd.

Редактировать:

Послечитая ваш код немного больше, кажется, что у вас будут другие проблемы с плохими значениями.Код ниже имеет немного больше смысла для меня.Это предполагает, что все финансы, социальные сети и тикеты - @synthesized ивары.

- (void)switchViews:(id)sender
{
    UIButton *button = (UIButton *)sender;
    UIViewController *nextViewController;
    int tag = button.tag;

    switch (tag)
    {
        // -- has already been created
        case kFinancialButton:
            nextViewController = self.financials;
            break;

        case kSocialButton:
            if (!social) {
                self.social = [[[SocialViewController alloc] initWithNibName:@"SocialViewController" bundle:nil] autorelease];
            }
            nextViewController = self.social;
            break;

        case kTicketingButton:
            if (!ticketing) {
                self.ticketing = [[[TicketingViewController alloc] initWithNibName:@"TicketingViewController" bundle:nil] autorelease];
            }
            nextViewController = self.ticketing;
            break;
    }

    // Do something with nextViewController I'd assume

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