将项目转换为使用ARC时,"切换案例是否在受保护的范围内"是什么意思?

Ali*_*Ali 283 xcode objective-c automatic-ref-counting

将项目转换为使用ARC时,"切换案例是否在受保护的范围内"是什么意思?我正在转换一个项目使用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;
}
Run Code Online (Sandbox Code Playgroud)

Fei*_*anZ 652

每个箱子周围都有支架{}.这应该解决问题(它在我的一个项目中为我做了).

  • 这已经有一段时间了,但我似乎记得C标准中的一些内容,它不允许在case语句之后进行变量赋值,因为代码实际上不在块内.通过在`case`之后和`break`之前添加花括号`{...}`,内部的所有内容都在一个范围内的块中,并且将按预期运行.我已经说到我只是自动从我的`case`语句中删除一个块来避免这种问题. (87认同)
  • 之所以发生这种情况,是因为您在案例范围内声明了一个新变量.编译器不知道这个变量应该如何作用域(它是属于所有的switch情况还是仅仅是当前的情况?)将case的实现包装在括号中会为变量生成一个范围,以便编译器可以正确管理这是一生. (59认同)
  • 大括号可帮助编译器了解范围.我知道如果你在没有大括号的case语句的第一行声明了一个新变量,GCC曾经发出警告,而ARC上的WWDC 2011视频提到了一些关于用大括号括起案例的内容.如果您想知道原因,请查看该视频 - 我无法记住我的头脑. (12认同)
  • 我遇到了同样的问题.这是一个可怕的错误消息,并且已经提交了一个错误(将在未来版本的编译器中修复)以纠正它.但是,是的,C中的case语句中的范围规则真的很奇怪. (2认同)

Fly*_*ver 14

很难确定没有查看代码,但这可能意味着交换机内部会发生一些变量声明,编译器无法判断是否有一条通向所需dealloc点的明确路径.


Vin*_*ent 9

有两种简单的方法可以解决这个问题:

  • 您可能正在声明变量.将变量声明移到switch语句之外
  • 将整个案例块放在大括号之间{}

当要释放变量时,编译器无法计算代码行.导致此错误.


小智 5

对我来说,问题始于开关的中间,并且大括号没有解决,除非你必须在所有之前的case语句中包含{}.对我来说,错误发生在我发表声明时

NSDate *start = [NSDate date];
Run Code Online (Sandbox Code Playgroud)

在前一种情况下.删除之后,所有后续的case语句都从受保护的范围错误消息中清除