在转换项目使用ARC时,“switch case in protected scope”是什么意思?
在转换项目使用ARC时,“switch case in protected scope”是什么意思? 我正在转换项目使用ARC,使用Xcode 4编辑 – >重构 – >转换为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; }
用大括号{}
围绕每个案例。 这应该解决这个问题(它在我的一个项目中为我做了)。
很难确定没有看代码,但这可能意味着在交换机内部发生了一些variables声明,编译器无法确定是否有清楚的path指向所需的dealloc点。
有两个简单的方法来解决这个问题:
- 你可能会声明variables。 移动switch语句之外的variables声明
- 将整个大小写块放在大括号{}之间
当variables被释放时,编译器不能计算代码行。 导致这个错误。
对我来说,这个问题是从一个开关的中间开始的,大括号没有解决,除非你必须在所有以前的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; }
在开关外部声明variables,然后在大小写内部实例化它们。 这对我使用Xcode 6.2是完美的
default: CellIdentifier = @"Cell"; cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { ***initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];*** cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } break; }
注意:检查! 粗体和斜体行的语法。 纠正它,你很好去。
用括号括起case语句和每个case中的break之间的代码。 它在我的代码上工作。