Ao converter um projeto para usar o ARC, o que significa “switch case is in protected scope”?

Ao converter um projeto para usar o ARC, o que significa “alternar maiúsculas e minúsculas no escopo protegido”? Eu estou convertendo um projeto para usar o ARC, usando o Xcode 4 Edit -> Refactor -> Converter para Objective-C ARC … Um dos erros que recebo é “switch case está no escopo protegido” em “alguns” dos switches em um caso de switch.

Editar, aqui está o código:

o ERRO está marcado no caso “padrão”:

- (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; } 

Envolva cada caso em si com chaves {} . Isso deve resolver o problema (isso aconteceu comigo em um dos meus projetos).

É difícil ter certeza sem olhar para o código, mas isso provavelmente significa que há alguma declaração variável acontecendo dentro do switch e o compilador não pode dizer se existe um caminho claro para o ponto de dealloc necessário.

Existem duas maneiras fáceis de resolver esse problema:

  • Você provavelmente está declarando variables. Mover a declaração das variables ​​fora da instrução switch
  • Coloque todo o bloco de casos entre chaves {}

O compilador não pode calcular a linha de código quando as variables ​​devem ser liberadas. Causando esse erro.

Para mim, o problema começou no meio de um switch e chaves não funcionaram, a menos que você tenha que include {} em todas as declarações de casos anteriores. Para mim, o erro veio quando tive a declaração

 NSDate *start = [NSDate date]; 

no caso anterior. Depois que eu deletei isso, todas as declarações de casos subseqüentes foram limpas da mensagem de erro do escopo protegido.

Antes:

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

Mudei a definição do NSDate antes de mudar e consertei o problema de compilation:

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

Declare as variables ​​fora do switch e instancie-as dentro do gabinete. Isso funcionou perfeitamente para mim usando o Xcode 6.2

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

Nota: Verifique! A syntax da linha em negrito e itálico. Retifique e você está pronto para ir.

Envolva com chaves {} o código entre a declaração do caso e a quebra em cada caso. Funcionou no meu código.