@ 기호는 objective-c에서 무엇을 나타 냅니까?


141

objective-c를 배우고 있으며 @ 기호에 계속 부딪칩니다. 예를 들어 문자열 시작시 또는 접근 자 메서드를 합성하는 등 다른 시나리오에서 사용됩니다.

objective-c에서 @ 기호는 무엇을 의미합니까?


@interface와 @end 앞에 @를 사용하는 이유는 무엇입니까?
Lalit Kumar

답변:


159

@문자는 C 또는 C ++ 식별자에서 사용되지 않으므로 다른 언어의 키워드와 충돌하지 않는 방식으로 Objective-C 언어 키워드를 도입하는 데 사용됩니다. 이를 통해 언어의 "객관적인"부분이 C 또는 C ++ 부분과 자유롭게 혼합 될 수 있습니다.

따라서 @일부 Objective-C 코드에서 볼 때마다 예외가 거의 없지만 C 또는 C ++ 구문이 아닌 Objective-C 구문을보고있는 것입니다.

주요 예외는 id, Class, nil,와 Nil, 일반적으로 언어 키워드로 취급하는 그들은 또한이 경우에도 typedef또는 #define그들 뒤에 있습니다. 예를 들어, 컴파일러는 실제로 id선언에 적용되는 포인터 유형 변환 규칙 및 GC 쓰기 장벽 생성 여부 결정과 관련하여 특별히 처리 합니다.

다른 예외 in, out, inout, oneway, byref, 그리고 bycopy; 분산 된 객체를보다 효율적으로 만들기 위해 메소드 매개 변수 및 리턴 유형에 대한 스토리지 클래스 주석으로 사용됩니다. (그들은 DO가 최선의 방법 직렬화에 거래를 결정하기에 볼 수 있습니다 런타임에서 사용할 수있는 방법 서명의 일부가됩니다.) 내 속성도있다 @property선언, copy, retain, assign, readonly, readwrite, nonatomic, getter, 그리고 setter; 그것들은 @property선언 의 속성 섹션 내에서만 유효합니다 .


4
@ (expression)의 기능에 대해 설명해 주시겠습니까? xcode에 @를 입력하면 표시되는 팝업에서 이해할 수없는 유일한 항목입니다.
jchnxu

10
@ (99)는 [NSNumber numberWithInteger : 99]와 같습니다. @ (YES)는 [NSNumber numberWithBool : YES]와 같습니다. @ 기호는 객체를 만드는 바로 가기입니다.
JoJo

7
이 "답변"이 명시된 질문에 실제로 답변하지 않는다는 사실에 혼란스러워하는 사람이 있습니까? 어커는 "Objective-C에서 '@'은 무엇을 의미합니까?"라고 말합니다. 응답자는 "목표 C를 사용하고 있음을 의미합니다"라고 말합니다. 나는 그가 이미 많이 알고 있다고 생각합니다.
Jon McClung

1
임의의 종류; 첫 번째 Objective-C 프리 프로세서가 작성 될 때 기본 ASCII 세트에 있어야하고 C에서 아직 사용하지 않았습니다. 그렇습니다 @.
Chris Hanson

1
Jon McClung : 레오는 맞습니다.“더 깊은 의미”는 없습니다. 이 @문자는 C에서 사용되지 않았기 때문에 기존 구문과 100 % 호환성을 유지하는 대체 구문 분석에 편리한 "탈출 해치"였습니다.
Chris Hanson

63

에서 에서 @ 기호 : 오브젝티브 C 튜토리얼 , 그것은 다양한 키워드의 전면에 이유 :

@를 사용하면 Objective-C 컴파일러를 기존 C 컴파일러에 쉽게 연결할 수 있습니다. @는 문자열 리터럴을 제외한 C의 컨텍스트에서 유효하지 않기 때문에 토크 나이저 (컴파일러의 초기 단계 및 간단한 단계)는 문자열 상수 외부에서 @ 문자를 찾기 위해 간단하게 수정할 수 있습니다 (토큰자는 문자열 리터럴을 이해합니다) 따라서 이것을 구별 할 수있는 위치에 있습니다). @가 나오면 토크 나이 저는 나머지 컴파일러를 "Objective-C 모드"로 설정합니다. Objective-C 구문 분석기는 Objective-C 코드의 끝을 감지하면 컴파일러를 일반 C 모드로 다시 되 돌리는 역할을합니다.

또한 문자열 리터럴 앞에서 볼 때 C에서 'char *'가 아닌 NSString을 만듭니다.


24

에서 Macrumors : 오브젝티브 C 튜토리얼 , 때 문자열 리터럴 앞에 :

@ ""NSString 리터럴도 있습니다. 기본적으로 NSString의 + stringWithUTF8String 메서드의 약어입니다.

@는 또한 C 문자열에 유니 코드 지원을 추가합니다.


12
"NSString의 + stringWithUTF8String 메서드의 약어입니다." 정확히는 아닙니다. 문자열은 정적으로 할당되므로 문자열과 다르게 +[NSString stringWithUTF8String:](동적으로 할당 됨) 릴리스 및 유지는 영향을 미치지 않습니다.

16

로부터 수동 :

Objective-C 프레임 워크는 일반적으로 C 스타일 문자열을 사용하지 않습니다. 대신, 문자열을 NSString 객체로 전달합니다.

NSString 클래스는 임의 길이의 문자열 저장을위한 내장 메모리 관리, 유니 코드 지원, printf 스타일 형식화 유틸리티 등을 비롯하여 기대할 수있는 모든 장점이있는 문자열에 대한 객체 래퍼를 제공합니다. 이러한 문자열은 일반적으로 사용되므로 Objective-C는 상수 값에서 NSString 객체를 생성하기위한 간단한 표기법을 제공합니다. 이 속기를 사용하려면 다음 예제와 같이 일반적인 큰 따옴표 붙은 문자열 앞에 @ 기호를 붙이기 만하면됩니다.

NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];

3
그러나 이것은 어디에 @사용 되는지의 한 예일뿐입니다 . 나는 다음과 같은 코드를보고있다 : mapperOptions = @{ kSTMapperVolumeResolutionKey: @(volumeResolution),... NSString 과 관련이 없음
GreenAsJade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.