Effective Objective-C 2.0 - 4: 상수 형식을 많이 사용하고 #define 예처리 명령을 적게 사용합니다
#define ANIMATION_DURATTON 0.5
이 예처리 명령은 코드의 ANIMATION 을DURATTON 문자열을 0.5로 바꾸지만, 이렇게 정의된 상수는 유형 정보가 없고, 예처리 과정에서 닿는 모든ANIMATIONDURATTON이 0.5로 바뀌면 이 지령이 어떤 헤더 파일에 성명된다고 가정하면 이 헤더 파일을 도입한 모든 코드는ANIMATIONDURATTON이 모두 교체됩니다.
이 문제를 해결하는 가장 좋은 방법은 컴파일러의 일부 특성을 이용하여 예처리 명령으로 상수를 정의하는 것보다 더 좋은 방법이 있다는 것이다. 예를 들어 다음과 같다.
static const NSSTimeInterval kAnimationDuration = 0.5;
이 방식으로 정의된 상수는 유형 정보를 포함하는데 그 장점은 상수의 의미를 명확하게 설명하고 이 상수의 유형이 NSSTimeInterval이라는 것을 알 수 있다는 것이다.
상수의 위치를 정의하는 것은 매우 중요하다. 우리는 항상 헤더 파일에 예처리 명령을 설명하는 것을 좋아한다. 이렇게 하면 좋지 않다. 상수의 이름이 서로 충돌할 수 있을 때 더욱 그렇다.예를 들어, ANIMATIONDURATTON이라는 상수명은 헤더 파일에 정의해서는 안 된다. 왜냐하면 이 헤더 파일을 도입한 모든 다른 파일에 이 이름이 나타나기 때문이다.사실 static const로 정의된 상수조차도 헤더 파일에 나타나지 말아야 한다.Objective-C에는'이름 공간'이라는 개념이 없기 때문에 그렇게 하면 kAnimationDuration이라는 전역 변수를 성명하는 것과 같기 때문에 이름은 반드시 접두사를 붙여서 소속 클래스를 표시해야 한다.
어떤 상수를 공개하지 않으려면 이 상수를 사용하는 실현 파일에 정의해야 한다. 예를 들어 다음과 같다.
EOCAnimatedView.h
#import
@interface EOCAnimatedView : UIView
-(void)animate;
@end
//EOCAnimatedView.m
#import "EOCAnimatedView.h"
static const NSSTimeInterval kAnimationDuration = 1.5;
@implementation EOCAnimatedView
-(void)animate{
}
@end
변수는 반드시static과const로 성명해야 한다. 사실상 하나의 변수는static이고 const로 성명하면 컴파일러는 기호를 만들지 않고 #define 예처리 명령처럼 모든 변수를 상수로 바꾼다. 그러나 이런 방식으로 정의된 상수는 유형 정보를 가지고 있다는 것을 기억해야 한다.
때때로 상수를 대외적으로 공개해야 할 때가 있다. 이런 상수는'전역 기호표'에 놓아서 이 상수를 정의하는 컴파일러 단원 이외에 사용할 수 있도록 해야 하기 때문에 그 정의 방식은 상례에서 보여준static const와 다르다.
//In the header file
extern NSString *const EOCStringConstant;
//In the implementation file
NSString *const EOCStringConstant=@"VALUE";
이 상수는 헤더 파일에서 '성명' 을 하고, 실행 파일에서 '정의' 를 하며, const 수식자는 상수 형식의 위치에 있으며, 상수는 오른쪽에서 왼쪽으로 해석됩니다.컴파일러는 헤더 파일의 extern 키워드를 보면 이 파일을 도입한 코드에서 이 상수를 처리하는 방법을 알 수 있습니다.이 키워드는 컴파일러에게 전역 기호표에 EOCStringConstant이라는 기호가 있음을 알려 줍니다. 컴파일러는 정의를 볼 필요가 없습니다. 이 코드를 이 상수로 사용할 수 있도록 허용합니다. 왜냐하면 이진 파일로 연결된 후에 이 상수를 찾을 수 있다는 것을 알고 있기 때문입니다.
이러한 상수는 반드시 정의해야 하며 한 번만 정의할 수 있다. 보통 이 상수를 성명하는 헤더 파일과 관련된 실현 파일에 정의되고, 실현 파일이 목표 파일을 생성할 때 컴파일러는 '데이터 세그먼트' 에서 문자열에 저장 공간을 분배한다.연결기는 이 대상 파일을 다른 대상 파일과 연결시켜 최종 바이너리 파일을 생성합니다. EOCStringConstant이라는 전역 기호를 사용하는 곳에 사용하면 링크기가 이를 해석할 수 있습니다.
상수의 이름을 주의하십시오. 명칭 충돌을 피하기 위해서는 이와 관련된 클래스를 접두사로 사용하는 것이 좋습니다.
이렇게 정의된 상수는 #define 예처리 명령을 사용하는 것보다 낫다. 왜냐하면 컴파일러는 상수의 값이 변하지 않도록 하기 때문이다. 어쨌든 예처리 명령을 사용하여 상수를 정의하지 말고 반지 컴파일러의 특성으로 상수의 정확성을 확보해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.