ChatGPT解决这个技术问题 Extra ChatGPT

将项目转换为使用 ARC 时,“switch case 在受保护范围内”是什么意思?

将项目转换为使用 ARC 时,“switch case 在受保护范围内”是什么意思?我正在使用 Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC 将项目转换为使用 ARC ...我得到的错误之一是“某些”开关上的“开关盒在受保护范围内”一个开关盒。

编辑,这是代码:

错误标记在“默认”情况下:

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

F
FeifanZ

用大括号 {} 将每个案例本身括起来。那应该可以解决问题(在我的一个项目中对我有用)。


大括号帮助编译器理解范围。我知道如果您在没有大括号的 case 语句的第一行声明了一个新变量,GCC 会发出警告,并且 ARC 上的 WWDC 2011 视频提到了一些关于将 case 括在大括号中的内容。如果你想知道为什么,看看那个视频——我想不起来了。
已经有一段时间了,但我似乎记得 C 标准中的某些内容不允许在 case 语句之后进行变量赋值,因为代码实际上并不在块内。通过在 casebreak 之前添加花括号 {...},内部的所有内容都在一个作用域块中,并且将按预期运行。我已经到了这样的地步,即我只是自动在我的 case 语句中设置一个块以避免这种问题。
我遇到了同样的问题。这是一个可怕的错误消息,并且已经提交了一个错误(将在编译器的未来版本中修复)来纠正它。但是,是的,C 语言中的 case 语句中的作用域规则确实非常……奇怪。
发生这种情况是因为您在案例范围内声明了一个新变量。编译器不知道这个变量应该如何确定范围(它属于所有的 switch 案例还是只属于当前案例?)将案例的实现包装在括号中会为变量创建一个范围,以便编译器可以正确管理这是一生。
请注意,在没有花括号的 case 语句中的块内声明变量时也会发生这种情况。那是一两分钟的头疼。 =)
F
Flyingdiver

不看代码就很难确定,但这可能意味着开关内部正在进行一些变量声明,编译器无法判断是否有通往所需释放点的清晰路径。


V
Vincent

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

您可能正在声明变量。将变量的声明移到 switch 语句之外

将整个 case 块放在大括号 {} 之间

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


Z
Z. Zepos

对我来说,问题从开关中间开始,大括号没有解决,除非您必须在所有以前的案例语句中包含 {}。对我来说,当我收到声明时,错误就来了

NSDate *start = [NSDate date];

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


一样;中间的大小写错误。我只需要将变量声明移到开关上方(它不依赖于大小写)。我不必在箱子周围添加大括号(这次)。
R
Roozbeh Zabihollahi

前:

    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;

}

u
user3433008

在 switch 外部声明变量,然后在 case 内部实例化它们。这对我使用 Xcode 6.2 非常有效


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

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


D
David Vargas

在每种情况下,用大括号 {}case 语句和 break 之间的代码括起来。它适用于我的代码。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅