提问



将项目转换为使用ARC时,切换案例是否在受保护的范围内是什么意思?
我正在转换一个项目使用ARC,使用Xcode 4 Edit - > Refactor - > Convert to 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;
}

最佳参考


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

其它参考1


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

其它参考2


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



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

  • 将整个案例块放在大括号{}
  • 之间


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

其它参考3


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


NSDate *start = [NSDate date];


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

其它参考4


之前:


    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;

}

其它参考5


在switch之外声明变量,然后在case中实例化它们。
这对我来说非常适合使用Xcode 6.2

其它参考6


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


注意:检查!粗体&的语法斜体线。整顿它,你很高兴。

其它参考7


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