Objective c 将项目转换为使用ARC时,什么是;开关箱在保护范围内;什么意思?

Objective c 将项目转换为使用ARC时,什么是;开关箱在保护范围内;什么意思?,objective-c,xcode,automatic-ref-counting,Objective C,Xcode,Automatic Ref Counting,将项目转换为使用ARC时,“开关箱在保护范围内”是什么意思? 我正在将一个项目转换为使用ARC,使用Xcode 4编辑->重构->转换为Objective-C ARC。。。 我得到的一个错误是开关盒中“某些”开关上的“开关盒在保护范围内” 编辑, 代码如下: 错误标记在“默认”情况下: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

将项目转换为使用ARC时,“开关箱在保护范围内”是什么意思? 我正在将一个项目转换为使用ARC,使用Xcode 4编辑->重构->转换为Objective-C 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;
}

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

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


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

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

}

NSDate*from;/* 有两种简单的方法可以解决此问题:

  • 您可能正在声明变量。移动变量的声明 在switch语句之外
  • 将整个箱子块放在花括号{}之间
当释放变量时,编译器无法计算代码行。
导致此错误的原因

在开关外部声明变量,然后在案例内部实例化它们。
这对我来说非常有效,使用Xcode 6.2,在每种情况下,case语句和break之间的代码都用大括号括起来。
大括号有助于编译器理解作用域。我知道如果您在case语句的第一行声明了一个新变量而没有大括号,GCC会发出警告,而ARC上的WWDC 2011视频提到了一些关于用大括号括起case的内容。如果你想知道为什么,看看那个视频——我记不清了。已经有一段时间了,但我似乎记得C标准中的一些东西,它不允许在case语句后赋值,因为代码实际上不在块内。通过在
案例
之后和
中断
之前添加大括号,
{…}
,内部的所有内容都在一个作用域块中,并将按照预期的方式运行。我已经到了这样的地步,我只是自动地把我的
case
语句做了一个块来避免这种问题。我遇到了同样的问题。这是一条可怕的错误消息,并且已经提交了一个bug(将在未来版本的编译器中修复)来纠正它。但是,是的,C中case语句中的作用域规则非常。。。奇怪。发生这种情况是因为您在案例范围内声明了一个新变量。编译器不知道该变量的作用域应该是什么(它是属于所有开关情况还是仅属于当前情况?)将case的实现包装在括号中会为变量创建一个作用域,以便编译器可以正确管理它的生存期。请注意,在case语句中的块中声明变量时,如果没有大括号,也会发生这种情况。有一两分钟的时间,这真是让人头疼同样的事情;在中间出现病例错误。我只需将变量声明移到开关上方(它不依赖于大小写)。我不必在箱子周围加大括号(这次)。
NSDate *from;  /* <----------- */
switch (index) {
    ....
    case 2:
        from = [NSDate dateWithTimeIntervalSince1970:1388552400];
        [self refreshContents:from toDate:[NSDate date]];
        break;

}