Lors de la conversion d'un projet pour utiliser ARC, que signifie "la casse du commutateur est dans la portée protégée"? Je convertis un projet pour utiliser ARC, en utilisant Xcode 4 Édition -> Refactor -> Convertir en ARC Objective-C ... Une des erreurs que j’obtiens est que "le boîtier du commutateur est protégé" sur "certains" des commutateurs de un boîtier de commutation.
Modifier, voici le code:
l'ERREUR est marqué sur le cas "par défaut":
- (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;
}
Entourez chaque caisse d’accolades {}
. Cela devrait régler le problème (cela a été le cas pour moi dans l'un de mes projets).
Difficile d’être sûr sans regarder le code, mais cela signifie probablement qu’une déclaration de variable est en cours à l’intérieur du commutateur et que le compilateur ne peut pas dire s’il existe un chemin clair vers le point dealloc requis.
Il existe 2 façons simples de résoudre ce problème:
Le compilateur ne peut pas calculer la ligne de code lorsque les variables doivent être libérées. Causer cette erreur.
Pour moi, le problème a commencé au milieu d'un commutateur et les accolades n'ont pas fonctionné, sauf si vous devez inclure {} IN TOUS les énoncés de cas précédents. Pour moi l'erreur est venue quand j'ai eu la déclaration
NSDate *start = [NSDate date];
dans le cas précédent. Après avoir supprimé cette information, toutes les instructions de cas suivantes sont vierges du message d'erreur de la portée protégée.
Avant:
case 2:
NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400];
[self refreshContents:from toDate:[NSDate date]];
break;
J'ai déplacé la définition de NSDate avant le basculement et cela a résolu le problème de compilation:
NSDate *from; /* <----------- */
switch (index) {
....
case 2:
from = [NSDate dateWithTimeIntervalSince1970:1388552400];
[self refreshContents:from toDate:[NSDate date]];
break;
}
Déclarez les variables en dehors du commutateur, puis instanciez-les à l'intérieur du cas. Cela fonctionnait parfaitement pour moi avec 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;
}
Remarque: Vérifiez! La syntaxe de la ligne en gras et en italique. Rectifiez-le et vous êtes prêt à partir.
Surround avec des accolades {}
le code entre les instructions case et pause. Cela a fonctionné sur mon code.