在转换项目使用ARC时,“switch case in protected scope”是什么意思?

在转换项目使用ARC时,“switch case in protected scope”是什么意思? 我正在转换项目使用ARC,使用Xcode 4编辑 – >重构 – >转换为Objective-C ARC …我得到的一个错误是“开关大小在保护范围内”一个开关盒。

编辑,这是代码:

ERROR在“默认”情况下被标记:

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

用大括号{}围绕每个案例。 这应该解决这个问题(它在我的一个项目中为我做了)。

很难确定没有看代码,但这可能意味着在交换机内部发生了一些variables声明,编译器无法确定是否有清楚的path指向所需的dealloc点。

有两个简单的方法来解决这个问题:

  • 你可能会声明variables。 移动switch语句之外的variables声明
  • 将整个大小写块放在大括号{}之间

当variables被释放时,编译器不能计算代码行。 导致这个错误。

对我来说,这个问题是从一个开关的中间开始的,大括号没有解决,除非你必须在所有以前的case语句中包含{}。 对于我来说,当我发表声明的时候,错误就来了

 NSDate *start = [NSDate date]; 

在以前的情况下。 删除后,所有后续的case语句都从受保护的作用域错误消息中清除

之前:

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

我在切换之前移动了NSDate的定义,并修复了编译问题:

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

在开关外部声明variables,然后在大小写内部实例化它们。 这对我使用Xcode 6.2是完美的

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

注意:检查! 粗体和斜体行的语法。 纠正它,你很好去。

用括号括起case语句和每个case中的break之间的代码。 它在我的代码上工作。