当转换项目使用ARC时,“开关情况在保护范围内”是什么意思? 我正在转换一个项目使用ARC,使用Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC… 我得到的一个错误是“开关箱在保护范围内”在开关箱中的“一些”开关上。

编辑, 代码如下:

ERROR标记在"default"大小写上:

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

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


用大括号{}包围每个case本身。这应该可以解决问题(在我的一个项目中确实如此)。


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

注意:检查!粗体和斜体行的语法。纠正它,你就可以开始了。


对我来说,这个问题始于一个开关的中间,花括号没有解决,除非你必须在所有前面的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;

}

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

你可能在声明变量。移动变量的声明 在switch语句之外 将整个case块放在花括号{}之间

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


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


用大括号{}将每个case中的case语句和断点之间的代码括起来。 它对我的代码有效。