ARCを使用するようにプロジェクトを変換するとき、「スイッチケースは保護されたスコープ内にある」とはどういう意味ですか? Xcode 4 Edit-> Refactor-> Convert to Objective-C ARCを使用して、ARCを使用するようにプロジェクトを変換しています...取得するエラーの1つは、スイッチの「一部」の「スイッチケースが保護範囲内にあります」スイッチケース。
編集、ここにコードがあります:
「デフォルト」の場合にエラーがマークされます:
- (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つの簡単な方法があります。
コンパイラは、変数が解放されるときにコード行を計算できません。このエラーの原因。
私にとっては、問題はスイッチの途中で始まり、{}を以前のすべての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;
}
スイッチの外部で変数を宣言し、ケース内でインスタンス化します。それは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ステートメントと各ケースのbreakの間のコード。それは私のコードで機能しました。