web-dev-qa-db-fra.com

Lors de la conversion d'un projet pour utiliser ARC, que signifie "la casse du commutateur est dans la portée protégée"?

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;
}
283
Ali

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).

652
FeifanZ

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.

14
Flyingdiver

Il existe 2 façons simples de résoudre ce problème:

  • Vous déclarez probablement des variables. Déplacer la déclaration des variables en dehors de l'instruction switch
  • Placez le bloc de cas entier entre accolades {}

Le compilateur ne peut pas calculer la ligne de code lorsque les variables doivent être libérées. Causer cette erreur.

9
Vincent

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.

5
Z. Zepos

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;

}
3
Roozbeh Zabihollahi

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

2
user3433008
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.

1
hemant_maverik

Surround avec des accolades {} le code entre les instructions case et pause. Cela a fonctionné sur mon code.

0
David Vargas