web-dev-qa-db-ja.com

ARCを使用するようにプロジェクトを変換するとき、「スイッチケースは保護されたスコープ内にある」とはどういう意味ですか?

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;
}
283
Ali

各ケース自体を中括弧{}で囲みます。これで問題が解決するはずです(私のプロジェクトの1つでそれを行いました)。

652
FeifanZ

コードを確認せずに確認するのは難しいですが、おそらくスイッチ内で変数宣言が行われていることを意味し、コンパイラは必要なdeallocポイントへの明確なパスがあるかどうかを判断できません。

14
Flyingdiver

この問題を解決するには、2つの簡単な方法があります。

  • おそらく変数を宣言しています。変数の宣言をswitchステートメントの外側に移動します
  • 中括弧{}の間にケースブロック全体を入れます

コンパイラは、変数が解放されるときにコード行を計算できません。このエラーの原因。

9
Vincent

私にとっては、問題はスイッチの途中で始まり、{}を以前のすべてのcaseステートメントに含める必要がない限り、中括弧はうまくいきませんでした。私にとっては、私が声明を持っていたときにエラーが発生しました

NSDate *start = [NSDate date];

前の場合。これを削除した後、保護されたスコープのエラーメッセージから後続のすべてのcaseステートメントがクリーンになりました

5
Z. Zepos

前:

    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;

}
3

スイッチの外部で変数を宣言し、ケース内でインスタンス化します。それはXcode 6.2を使用して私にとって完璧に機能しました

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

注:チェックしてください!太字と斜体の行の構文。それを修正し、あなたは行ってもいいです。

1
hemant_maverik

中括弧で囲む{}caseステートメントと各ケースのbreakの間のコード。それは私のコードで機能しました。

0
David Vargas