Effective Objective-C 2.0 - 4: 상수 형식을 많이 사용하고 #define 예처리 명령을 적게 사용합니다

2658 단어
코드를 작성할 때 항상 상수를 정의한다. 예를 들어 한 페이지에 애니메이션을 재생하면 많은 개발자들이 팔방 애니메이션의 시간을 상수로 추출한다.
#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 예처리 명령을 사용하는 것보다 낫다. 왜냐하면 컴파일러는 상수의 값이 변하지 않도록 하기 때문이다. 어쨌든 예처리 명령을 사용하여 상수를 정의하지 말고 반지 컴파일러의 특성으로 상수의 정확성을 확보해야 한다.

좋은 웹페이지 즐겨찾기