问题
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