Al convertir un proyecto para usar ARC, ¿qué significa "cambiar de mayúscula a minúscula en ámbito protegido"? Estoy convirtiendo un proyecto para usar ARC, usando Xcode 4 Edición -> Refactor -> Convertir a Objective-C ARC ... Uno de los errores que obtengo es "el caso del interruptor está en alcance protegido" en "algunos" de los conmuta en una caja de interruptor.Al convertir un proyecto para usar ARC, ¿qué significa "Cambiar caso está en ámbito protegido"?
Editar, Aquí está el código:
el error está marcado en el caso "default":
- (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;
}
¡Guau! ¡Funcionó! ¡¿pero por qué?! – Ali
Las llaves ayudan al compilador a entender el alcance.Sé que GCC solía emitir una advertencia si declaraba una nueva variable en la primera línea de una declaración de caso sin llaves, y el video WWDC 2011 en ARC menciona algo acerca de incluir casos entre llaves. Si quieres saber por qué, echa un vistazo a ese video. No puedo recordarlo. – FeifanZ
Ha pasado un tiempo, pero parece recordar algo en el estándar C que no permitía la asignación de variables después de una declaración de caso porque el código no está realmente dentro de un bloque. Al agregar llaves {'...}' después del 'case' y antes del' break', todo lo que está dentro se encuentra en un bloque de ámbito y se comportará como se espera. He llegado al punto de que simplemente hago un bloque de mis declaraciones 'case' para evitar este tipo de problema. – Paul