При преобразовании проекта в использование ARC, что означает "случай переключения в защищенной области"?

При преобразовании проекта в использование ARC, что означает "случай переключения в защищенной области"? Я конвертирую проект для использования ARC, используя Xcode 4 Edit → Refactor → Преобразовать в Objective-C ARC... Одна из ошибок, которые я получаю, это "случай переключения в защищенной области" на "некоторых" коммутаторах в корпусе коммутатора.

Изменить, Вот код:

ОШИБКА отмечена в случае "по умолчанию":

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"";
    UITableViewCell *cell ;
    switch (tableView.tag) {
        case 1:
            CellIdentifier = @"CellAuthor";
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        cell.textLabel.text = [[prefQueries objectAtIndex:[indexPath row]] valueForKey:@"queryString"];
        break;
    case 2:
        CellIdentifier = @"CellJournal";
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        cell.textLabel.text = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"name"];

        NSData * icon = [[prefJournals objectAtIndex:[indexPath row]] valueForKey:@"icon"];
        if (!icon) {
            icon = UIImagePNGRepresentation([UIImage imageNamed:@"blank72"]);
        }
        cell.imageView.image = [UIImage imageWithData:icon];

        break;

    default:
        CellIdentifier = @"Cell";
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
        break;
    }


    return cell;
}

Ответ 1

Окружать каждый случай с помощью фигурных скобок {}. Это должно решить проблему (это было для меня в одном из моих проектов).

Ответ 2

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

Ответ 3

Есть два простых способа решить эту проблему:

  • Вы, вероятно, объявляете переменные. Переместить объявление переменных вне оператора switch
  • Поместите весь блок дела между фигурными скобками {}

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

Ответ 4

Для меня проблема началась с середины коммутатора, а фигурные скобки не сработали, если только вы не должны включать {} ВСЕ ВСЕ предыдущие утверждения case. Для меня ошибка пришла, когда у меня было утверждение

NSDate *start = [NSDate date];

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

Ответ 5

До:

    case 2:
        NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400];
        [self refreshContents:from toDate:[NSDate date]];
        break;

Я переместил определение NSDate перед коммутатором и исправил проблему компиляции:

NSDate *from;  /* <----------- */
switch (index) {
    ....
    case 2:
        from = [NSDate dateWithTimeIntervalSince1970:1388552400];
        [self refreshContents:from toDate:[NSDate date]];
        break;

}

Ответ 6

Объявите переменные за пределами коммутатора, а затем создайте их в этом случае. Это отлично сработало для меня, используя Xcode 6.2

Ответ 7

default:
        CellIdentifier = @"Cell";
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            ***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];***
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
        break;
    }

Примечание: проверьте! Синтаксис жирной и курсивной строки. Исправьте его, и вы хорошо пойдете.

Ответ 8

Окружать скобками {} код между оператором case и разрывом в каждом случае. Он работал над моим кодом.