Ao converter um projeto para usar o ARC, o que significa "mudar caso está no escopo protegido"? Estou convertendo um projeto para usar o ARC, usando o Xcode 4 Editar -> Refatorar -> Converter em ARC Objective-C ... Um dos erros que recebo é "a caixa de opção está no escopo protegido" em "algumas" das opções em um caso de interruptor.
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;
}
{...}
depoiscase
e antes dabreak
, tudo dentro está em um bloco com escopo definido e se comportará conforme o esperado. Cheguei ao ponto de apenas bloquear automaticamente minhascase
declarações para evitar esse tipo de problema.Difícil ter certeza sem olhar para o código, mas provavelmente significa que há alguma declaração de variável acontecendo dentro do comutador e o compilador não pode dizer se há um caminho claro para o ponto de desalocação necessário.
fonte
Existem 2 maneiras fáceis de resolver esse problema:
O compilador não pode calcular a linha de código quando as variáveis devem ser liberadas. Causando este erro.
fonte
Para mim, o problema começou no meio de um comutador e os colchetes não funcionaram, a menos que você precise incluir {} IN ALL declarações de casos anteriores. Para mim, o erro ocorreu quando recebi a declaração
no caso anterior. Depois de excluir isso, todas as instruções de caso subseqüentes foram limpas da mensagem de erro do escopo protegido
fonte
Antes:
Mudei a definição do NSDate antes do switch e ele corrigiu o problema de compilação:
fonte
Declare as variáveis fora do switch e instancie-as dentro do caso. Isso funcionou perfeitamente para mim usando o Xcode 6.2
fonte
Nota: Verifique! A sintaxe da linha em negrito e itálico. Retifique-o e você está pronto para ir.
fonte
Coloque entre chaves
{}
o código entre a instrução case e a quebra em cada caso. Funcionou no meu código.fonte