문제

Objective-C의 단일 밑줄은 Apple의 "내부"사용을 위해 예약되어 있으며 (Apple의 청구 전에 개인 인스턴스 변수와 함께 사용할 수 있음) 그러나 왜 그들은 a를 사용할 것입니다 더블-iPhone의 sqlitebooks 예제에있는 사람들은? MasterViewController.m에서 가져온이 스 니펫을 참조하십시오.

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

이에 대한 이중 문자 코어 사용에 대한 언급이 있습니다 법정 C와 관련하여 "Compier의 내부 사용"을위한 것입니다. 이 상황에서 그것이 어떻게 적용되는지 모르겠습니다.

내 앱에 sqlitebooks 예제 프로젝트의 것과 비슷하게 행동하는 ViewController가 필요하지만이 Double-Onderscore는 당황했습니다.

도움이 되었습니까?

해결책

C 컴파일러 나 Objective-C 컴파일러는 변수 이름을 다른 변수 이름과 다르게 밑줄로 처리하지 않습니다. 단일 또는 이중 선도 밑줄은 단순히 a입니다 협약 그리고 효과적으로 네임 스페이스를 형성합니다 NS 코코아 수업과 같은 접두사 NSString.

sqlitebooks 코드를보고 MasterViewController.m 이 정적 글로벌 변수를 정의합니다.

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

그래서 내 생각에 SQLITEBOOKS의 저자는 이중 선행 밑줄을 사용하여 글로벌 변수를 나타냅니다.

C 컴파일러 (및 확장 대상 C)는 컴파일러 공급 업체가 사용할 두 가지 밑줄과 대문자로 시작하여 표준 라이브러리를 구현하는 데 사용되는 글로벌 변수 및 기능에 사용할 수있는 예약 네임 스페이스를 제공하거나 새로운 비를 도입하는 데 사용될 예약 네임 스페이스를 제공합니다. -표준 키워드와 같은 __block.

sqlitebooks 코드는 기술적으로 유효하지만 제 생각에는 예약 네임 스페이스와 너무 쉽게 혼동됩니다. 해당 코드를 재사용하면 변수 이름을 바꾸는 것이 좋습니다 (Xcode에는 자동으로 수행 할 수있는 Refactoring의 이름 바꾸기가 아주 좋습니다).

다른 팁

컴파일러에 밑줄은 알파벳 성격처럼 취급됩니다. 더 일반적으로, 밑줄은 일반적으로 사용자 코드와의 충돌을 피하기 위해 언어 확장 또는 대형 라이브러리에서 사용됩니다.

많은 그룹이 밑줄의 특정 조합으로 모든 이름을 예약하려고 시도하기 때문에 밑줄을 사용하는 것은 문제가됩니다.

Apple은 전통적으로 단일 밑줄 접두사를 사용하여 개인 인스턴스 변수 (객체 지향 언어의 공통 스타일)를 나타냅니다. 이것은 애플이 코드에 밑줄을 사용하면 애플이 헤더를 변경하기로 결정하고 어쩌면 안면 안되는 경우 코코아와 충돌 할 수 있다고 지적 할 때까지 모든 사람이 Ivars를 밑줄로 접두사해야한다는 것을 암시했다. 따라서 밑줄 접두사는 "조언되지 않은"코딩 실습이되었습니다.

C 및 C 파생어 언어에서, 이중이있는 모든 단어는 미리적으로 강조되며 다음은 비표준 언어 확장입니다. __attribute__와 같은 Apple의 확장 참조

후행 밑줄은 종종 컴파일러 또는 디버거 이름의 원본 이름 (특히 컴파일러가 멀티 패스 일 때)으로 추가되며 일반적으로 이러한 이름이 원본과 명확하게 구별되도록 피할 수 있습니다. Google은 Apple의 밑줄과의 충돌을 피하기 위해 객체 C 로컬 인스턴스 변수를 밑줄로 밑줄로 접미사합니다.

내 조언 : 밑줄을 사용하지 마십시오. 인스턴스 변수와 동일한 이름의 로컬 변수를 사용해서는 안됩니다 (혼란 스럽습니다). 유일한 잠재적 충돌은 Setter 메소드의 매개 변수와 해당 인스턴스 변수간에 매개 변수가 소문자 "A", "New"(또는 유사한)로 매개 변수를 접두사해야 할 것입니다. 그러나 아직 "The"가치는 아닙니다.

그것은 단지 가변적 인 이름 지정 규칙 일뿐입니다. 그렇지 않습니다 하다 아무것. 프로그램 작가가 "이것은 개인 변수입니다."라고 스스로를 상기시키는 방법입니다.

컴파일러 / 라이브러리 공급 업체가 특정 프리 / 포스트 픽스를 "예약"으로 표시하는 것은 드문 일이 아닙니다. 이것은 주로 유형/정의/상속 변수 간의 실수로 충돌을 피하기위한 것입니다.

당신이 언급 한 게시물은 변수가 아닌 정의에 관한 것입니다. 많은 컴파일러는 제공하고 의존하는 정의에 이중 결장 코어를 사용합니다.

이 예제 코드 가이 스타일을 사용하는 이유에 관해서는 원래 저자가 일상 업무에서 사용하는 것과 동일한 코딩 스타일을 사용했으며 잠재적 충돌은 결코 강조되지 않았습니다.

코드 샘플을 as-Is로 유지해야하지만 불편한 경우 변수의 이름을 바꿀 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top