Где подходящее место для выпуска переменной с оператором переключателя Objective-C? - PullRequest
0 голосов
/ 21 сентября 2011

В следующем коде

NSDictionary *test;

switch (xxx) {
  case 1:
   ...
   return YES;
   break;

  case 2:
   ...
   return NO;
   break;

  case 3:
   ...
   return YES;
   break;
}

[test release];

Будет ли переменная «test» правильно освобождена или должен быть отдельный оператор release с каждым оператором регистра переключателя?

Ответы [ 5 ]

6 голосов
/ 21 сентября 2011

каждый раз, когда вы return XXX;, release не вызывается на вашем объекте.Я предлагаю воздержаться от возвращения в середине процедуры.Лучше сделать что-то вроде:

BOOL result = NO;
switch (xxx) {
  case 1: ... result = YES; break;
  case 2: ... result = NO; break;
  case 3: ... result = YES; break;
  default: result = NO;
}
[test release];
return result;
4 голосов
/ 21 сентября 2011

Если вы всегда хотите, чтобы тест был выпущен, просто используйте [test autorelease] перед оператором switch, что приведет к вызову release для теста через некоторое время после возврата из функции.

1 голос
/ 21 сентября 2011

Помимо хороших решений, вы можете сделать это:

@try {
    switch(xxx) {
        case 1:
            ...
            return YES;
            break;

        case 2:
            ...
            return NO;
            break;

        case 3:
            ...
            return YES;
            break;
    }
} @finally {
    [test release];
}

Наконец блоки запускаются даже после возврата.

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

1 голос
/ 21 сентября 2011

Поскольку это локальная переменная области действия, и до тех пор, пока вы не оставите (return) до конца блока switch, можно будет освободить его после оператора switch.

Если вы не alloc сделаете это внутри одного из операторов case s, оно останется нулевым, и нет проблем с отправкой сообщений release элементу nil, можно выпустить его после оператор switch.

1 голос
/ 21 сентября 2011

Если это поле класса, вы должны освободить его в методе dealloc, в противном случае, если это локальная переменная (как кажется в вашем случае), вы должны освободить его до того, как оно выйдет из области видимости (если, конечно, это не так). цель метода - вернуть динамически размещаемую переменную).

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