When converting a project to use ARC what does "switch case is in protected scope" mean?
Objective CXcodeAutomatic Ref-CountingObjective C Problem Overview
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;
}
Objective C Solutions
Solution 1 - Objective C
Surround each case itself with braces {}
. That should fix the issue (it did for me in one of my projects).
Solution 2 - Objective C
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.
Solution 3 - Objective C
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.
Solution 4 - Objective C
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
Solution 5 - Objective C
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;
}
Solution 6 - Objective C
Declare the variables outside the switch, then instantiate them inside the case. That worked perfectly for me using Xcode 6.2
Solution 7 - Objective C
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.
Solution 8 - Objective C
Surround with braces {}
the code between the case statement and the break in each case.
It worked on my code.