ARC를 사용하도록 프로젝트를 변환 할 때 "스위치 케이스가 보호 범위에 있음"은 무엇을 의미합니까?


283

ARC를 사용하도록 프로젝트를 변환 할 때 "스위치 케이스가 보호 범위에 있음"은 무엇을 의미합니까? Xcode 4 편집-> 리 팩터-> Objective-C ARC로 변환을 사용하여 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;
}

답변:


651

각 케이스 자체를 중괄호로 묶습니다 {}. 문제를 해결해야합니다 (내 프로젝트 중 하나에서 저를 위해).


12
중괄호는 컴파일러가 범위를 이해하는 데 도움이됩니다. 중괄호가없는 사례 설명의 첫 번째 줄에 새 변수를 선언하고 ARC에 대한 WWDC 2011 비디오에서 사례를 중괄호로 묶는 것에 대해 언급 한 경우 GCC가 경고를 발행 한 것으로 알고 있습니다. 왜 그런지 알고 싶다면 비디오를 확인하십시오. 머리 꼭대기를 기억할 수 없습니다.
FeifanZ

87
오래되었지만 코드가 실제로 블록 내부에 있지 않기 때문에 case 문 뒤에 변수 할당을 허용하지 않는 C 표준의 무언가를 기억하는 것 같습니다. 및 {...}뒤에 중괄호를 추가하면 내부의 모든 것이 범위가 지정된 블록에 있으며 예상대로 동작합니다. 이런 종류의 문제를 피하기 위해 자동으로 내 진술을 차단한다는 점에 도달했습니다 . casebreakcase
Paul

2
나는 같은 문제에 부딪쳤다. 그것은 끔찍한 오류 메시지이며 버그를 수정하여 버그를 수정했습니다 (차후 버전의 컴파일러에서 수정 될 예정 임). 그러나 그렇습니다 .C의 사례 문장 내 범위 지정 규칙은 실제로 매우 이상합니다.
bbum

59
사례 범위 내에서 새 변수를 선언했기 때문에 발생합니다. 컴파일러는이 변수의 범위를 어떻게 지정해야하는지 알지 못합니다 (모든 스위치 케이스 또는 현재 케이스에 속합니까?). 평생입니다.
시노하라

1
중괄호없이 case 문 내에서 블록 내 변수를 선언 할 때도 이러한 상황이 발생할 수 있습니다. 1-2 분 동안 머리를 긁는 사람이었습니다. =)
slycrel 2016 년

14

코드를 보지 않고는 확실하지 않지만 스위치 내부에 변수 선언이 있고 컴파일러가 필요한 할당 취소 지점에 대한 명확한 경로가 있는지 알 수 없습니다.


9

이 문제를 해결하는 두 가지 쉬운 방법이 있습니다.

  • 아마도 변수를 선언하고있을 것입니다. 변수 선언을 switch 문 외부로 이동
  • 전체 대괄호를 중괄호 {} 사이에 넣으십시오

변수가 해제 될 때 컴파일러가 코드 행을 계산할 수 없습니다. 이 오류가 발생했습니다.


5

나를 위해, 스위치 중간에서 문제가 시작되었고 {} IN ALL 이전 사례 설명을 포함하지 않으면 중괄호가 해결되지 않았습니다. 나에게 진술을 할 때 오류가 발생했다.

NSDate *start = [NSDate date];

이전의 경우. 이것을 삭제 한 후 모든 후속 사례 설명이 보호 범위 오류 메시지에서 깨끗해졌습니다.


같은 것; 중간에 오류가 발생했습니다. 변수 선언을 스위치 위로 이동해야했습니다 (대소 문자에 의존하지 않았습니다). 나는 이번에 케이스 주위에 중괄호를 추가 할 필요가 없었다.
eGanges

3

전에:

    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;

}

2

스위치 외부의 변수를 선언 한 다음 케이스 내부에서 변수를 인스턴스화하십시오. Xcode 6.2를 사용하여 완벽하게 작동했습니다.


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

참고 : 확인하십시오! 굵고 기울임 꼴로 표시된 구문입니다. 그것을 수정하면 갈 수 있습니다.


0

서라운드로 둘러싸 {}경우case 문과 각 경우 의 구분 사이에있는 코드 를 중괄호로 묶 습니다 . 내 코드에서 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.