Al convertir un proyecto para usar ARC, ¿qué significa “cambiar de mayúscula a minúscula”?

Al convertir un proyecto para usar ARC, ¿qué significa “cambiar de mayúscula a minúscula”? Estoy convirtiendo un proyecto para usar ARC, usando Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC … Uno de los errores que obtengo es “switch case is in protected scope” en “algunos” de los switches 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; } 

Rodea cada caja con llaves {} . Eso debería solucionar el problema (lo hice por mí en uno de mis proyectos).

Es difícil estar seguro sin mirar el código, pero probablemente significa que hay alguna statement de variable dentro del conmutador y el comstackdor no puede decir si hay una ruta clara al punto dealloc requerido.

Hay 2 formas sencillas de resolver este problema:

  • Probablemente estés declarando variables. Mueva la statement de las variables fuera de la instrucción switch
  • Coloque todo el bloque de la caja entre llaves {}

El comstackdor 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 medio de un cambio y las llaves no funcionaron, a menos que tengas que incluir {} EN TODAS las declaraciones de casos anteriores. Para mí, el error vino cuando tuve la statement

 NSDate *start = [NSDate date]; 

en el caso anterior. Después de que eliminé esto, todas las declaraciones de casos subsiguientes quedaron limpias del mensaje de error del scope protegido

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 comstackción:

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

Declara las variables fuera del interruptor, luego ejemplifícalas dentro de la caja. Eso funcionó perfectamente para mí usando 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: ¡Verifica! La syntax de la línea en negrita y en cursiva. Rectifícalo y estás listo para ir.

Rodee con llaves {} el código entre el enunciado de caso y el descanso en cada caso. Funcionó en mi código.