Lors de la conversion d'un projet pour utiliser ARC, que signifie "le commutateur est dans la portée protégée"? Je convertis un projet pour utiliser ARC, en utilisant Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC ... L'une des erreurs que j'obtiens est "le boîtier du commutateur est dans la portée protégée" sur "certains" des commutateurs dans un boîtier de commutation.
Edit, voici le code:
L'ERREUR est marquée 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;
}
{...}
aprèscase
et avant lebreak
, tout à l'intérieur est dans un bloc de portée et se comportera comme prévu. J'en suis arrivé au point que je fais juste automatiquement un bloc de mescase
déclarations pour éviter ce genre de problème.Difficile d'être sûr sans regarder le code, mais cela signifie probablement qu'il y a une déclaration de variable en cours à l'intérieur du commutateur et le compilateur ne peut pas dire s'il y a un chemin clair vers le point de désallocation requis.
la source
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 publiées. Causer cette erreur.
la source
Pour moi, le problème a commencé au milieu d'un commutateur et les accolades n'ont pas fonctionné, sauf si vous devez inclure {} DANS TOUTES les déclarations de cas précédentes. Pour moi, l'erreur est venue quand j'ai eu la déclaration
dans le cas précédent. Après avoir supprimé cela, toutes les instructions de cas suivantes sont venues du message d'erreur de portée protégée
la source
Avant:
J'ai déplacé la définition NSDate avant de basculer, et cela a résolu le problème de compilation:
la source
Déclarez les variables à l'extérieur du commutateur, puis instanciez-les à l'intérieur du cas. Cela a parfaitement fonctionné pour moi en utilisant Xcode 6.2
la source
Remarque: Vérifiez! La syntaxe de la ligne en gras et en italique. Rectifiez-le et vous êtes prêt à partir.
la source
Entourez d'accolades
{}
le code entre l' instruction case et la coupure dans chaque cas. Cela a fonctionné sur mon code.la source