当将一个项目转换为使用ARC时,“切换案例”在保护范围内是什么?的意思吗?

当将一个项目转换为使用ARC时,“开关情况在保护范围内”是什么意思? 我正在转换一个项目使用ARC,使用Xcode 4 Edit -> Refactor -> Convert to Objective-C ARC… 我得到的一个错误是“开关案例在保护范围内”在开关案例中的“一些”交换机上 < p >编辑, 代码如下:

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;
}
74028 次浏览

不查看代码很难确定,但这可能意味着在开关内部进行了一些变量声明,编译器无法判断是否有通往所需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块放在花括号{}之间
当释放变量时,编译器不能计算代码行。 导致此错误。< / p >
在switch外部声明变量,然后在case内部实例化它们。 使用Xcode 6.2

,这对我来说非常完美

在每种情况下,情况下语句和打破之间的代码都用大括号{}括起来。