objective-c xcode automatic-ref-counting

objective c - Al convertir un proyecto para usar ARC, ¿qué significa "cambiar el caso en un ámbito protegido"?



objective-c xcode (8)

Al convertir un proyecto para usar ARC, ¿qué significa "cambiar el caso en el ámbito protegido"? Estoy convirtiendo un proyecto para usar ARC, usando Xcode 4 Editar -> Refactorizar -> Convertir a Objective-C ARC ... Uno de los errores que recibo es "el caso del interruptor está en el ámbito protegido" en "algunos" de los interruptores 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; }


Antes de:

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

Moví la definición de NSDate antes del cambio y solucioné el problema de compilación:

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


Declare las variables fuera del interruptor y luego cree una instancia dentro del caso. Eso funcionó perfectamente para mí usando Xcode 6.2


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 decir si hay una ruta clara hacia el punto de dealloc requerido.


Hay 2 formas fáciles de resolver este problema:

  • Probablemente estás declarando variables. Mueva la declaración de las variables fuera de la instrucción switch
  • Ponga todo el bloque de caso entre corchetes {}

El compilador no puede calcular la línea de código cuando se van a liberar las variables. Causando este error.


Para mí, el problema comenzó en el medio de un interruptor y los paréntesis 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.

NSDate *start = [NSDate date];

En el caso anterior. Después de que eliminé esto, toda la declaración de caso subsiguiente salió limpia del mensaje de error del ámbito protegido


Rodear cada caso con llaves {} . Eso debería solucionar el problema (lo hizo para mí en uno de mis proyectos).


Rodee con llaves {} el código entre la declaración del caso y la ruptura en cada caso. Funcionó en mi código.


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

Nota: ¡Compruebe! La sintaxis de la línea en negrita y cursiva. Rectifícalo y eres bueno para ir.