When converting a project to use ARC what does “switch case is in protected scope” mean?

心不动则不痛 提交于 2019-11-26 12:35:38

问题


When converting a project to use ARC what does \"switch case is in protected scope\" mean? I am converting a project to use ARC, using Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC... One of the errors I get is \"switch case is in protected scope\" on \"some\" of the switches in a switch case.

Edit, Here is the code:

the ERROR is marked on the \"default\" case:

- (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;
}

回答1:


Surround each case itself with braces {}. That should fix the issue (it did for me in one of my projects).




回答2:


Hard to be sure without looking at the code, but it probably means there's some variable declaration going on inside the switch and the compiler can't tell if there's a clear path to the required dealloc point.




回答3:


There are 2 easy ways to solve this issue:

  • You are probably declaring variables. Move the declaration of the variables outside the switch statement
  • Put the whole case block in between curly brackets {}

The compiler can not calculate the code line when the variables are to be released. Causing this error.




回答4:


For me, the problem started on the middle of a switch and curly brackets did not worked out, unless you have to include {} IN ALL previous case statements. For me the error came when I had the statement

NSDate *start = [NSDate date];

in the previous case. After I deleted this, then all subsequent case statement came clean from the protected scope error message




回答5:


Before:

    case 2:
        NSDate *from = [NSDate dateWithTimeIntervalSince1970:1388552400];
        [self refreshContents:from toDate:[NSDate date]];
        break;

I moved NSDate definition before switch, and it fixed the compile problem:

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

}



回答6:


Declare the variables outside the switch, then instantiate them inside the case. That worked perfectly for me using Xcode 6.2




回答7:


default:
        CellIdentifier = @"Cell";
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            ***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];***
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
        break;
    }

Note: Check! The syntax of the bold & italicized line. Rectify it and you are good to go.




回答8:


Surround with braces {} the code between the case statement and the break in each case. It worked on my code.



来源:https://stackoverflow.com/questions/7562199/when-converting-a-project-to-use-arc-what-does-switch-case-is-in-protected-scop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!