Al convertir un proyecto para usar ARC, ¿qué significa "cambiar el caso está en el alcance protegido"? Estoy convirtiendo un proyecto para usar ARC, usando Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC ... Uno de los errores que obtengo es "la caja del interruptor está en el alcance protegido" en "algunos" de los interruptores en Una caja de interruptor.
Editar, aquí está el código:
el ERROR está marcado en el caso "predeterminado":
- (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;
}
{...}
después delcase
y antes delbreak
, todo dentro está en un bloque de alcance y se comportará como se esperaba. He llegado al punto de que automáticamente hago un bloqueo de miscase
declaraciones para evitar este tipo de problema.Es difícil estar seguro sin mirar el código, pero probablemente significa que hay una declaración de variables dentro del conmutador y el compilador no puede saber si hay una ruta clara hacia el punto de reparto requerido.
fuente
Hay 2 formas fáciles de resolver este problema:
El compilador no puede calcular la línea de código cuando se van a liberar las variables. Causando este error.
fuente
Para mí, el problema comenzó en medio de un interruptor y las llaves no funcionaron, a menos que tenga que incluir {} EN TODAS las declaraciones de casos anteriores. Para mí, el error vino cuando tuve la declaración
en el caso anterior Después de eliminar esto, toda la declaración de caso posterior se borró del mensaje de error de alcance protegido
fuente
Antes de:
Moví la definición de NSDate antes del cambio, y solucionó el problema de compilación:
fuente
Declare las variables fuera del conmutador, luego ejecútelas dentro del caso. Eso funcionó perfectamente para mí usando Xcode 6.2
fuente
Nota: ¡Verificar! La sintaxis de la línea en negrita y cursiva. Rectifícalo y listo.
fuente
Rodea con llaves
{}
el código entre la declaración del caso y el corte en cada caso. Funcionó en mi código.fuente