2013-08-25 4 views
2

저는 프로젝트에서 일부 문자열을 가지고 있고 모든 문자열을 상수라고하는 공통 파일에 넣고 싶습니다.Objective C에서 #define 또는 extern NSString * const를 사용하는 것이 더 좋습니다

(1 차 접근) constants.h에서, 내가 할 수있는 :

#define COMMON_STRING @"myString" 

또는

constants.h에서 (2 접근)

extern NSString *const COMMON_STRING; 
constants.m에서

NSString *const COMMON_STRING = @"myString"; 

어떤 접근 방식은 사용이 더 나은 이유는? 또는 우리는이에 대한 몇 가지 다른 더 좋은 방법이 있습니까? 그 후 통근자는 NSString * CONST의 COMMON_STRING 따르면

;

EDIT

메모리 관점에서 더 좋습니다. 하지만 어딘가에 나는 #define을 사용하여 문자열을 모든 어커런스에 삽입 할 것입니다. 컴파일러가 동일한 상수 문자열을 최적화하지 않는 한 메모리 사용량을 곱하면됩니다. 그렇다면 #define을 사용하지 않는 것이 맞습니까?

제안 게시물에서 하나의 게시물은 구조체를 정의하고 다른 것은 비교를 설명하지만 매우 제한적일뿐입니다. 내가 기대하는 것이 아닙니다. 컴파일러가 동일한 상수 문자열 발생을 최적화하면 extern NSString * const COMMON_STRING을 사용하고 # COMMON_STRING을 정의 하시겠습니까?

+1

해당 게시물 extern에 따르면 NSString * const COMMON_STRING; 메모리 관점에서 더 좋습니다. 하지만 어딘가에 나는 #define을 사용하여 문자열을 모든 어커런스에 삽입 할 것입니다. 컴파일러가 동일한 상수 문자열을 최적화하지 않는 한 메모리 사용량을 곱하면됩니다. 그렇다면 #define을 사용하지 않는 것이 맞습니까? – Apoorv

+1

메모리와 동일합니다. 컴파일러는 @ "foo"라는 문자열을 하나만 만들 것입니다. 하드 코딩을 여러 번해도 상관 없습니다. 모든 용도는 그 불변의 문자열을 사용합니다.하나 또는 다른 것을 사용하는 비 메모리 사유가있을 수 있습니다. – chadbag

답변

2

일반적으로 :

static const 

이 범위를 존중하고 그것을 입력-안전합니다.

내가 볼 수있는 유일한 제한 사항은 변수를 명령 줄에서 정의 할 수있게하려는 것입니다.

#ifdef VAR // Very bad name, not long enough, too general, etc.. 
static int const var = VAR; 
#else 
static int const var = 5; // default value 
#endif 

가능하면 대신 매크로/생략의, 형태 보증 된 대안을 사용

는하지만 여전히 대안이있다. 당신이 정말로 매크로로 이동해야하는 경우

는, 당신은 더 나은 이름 것 ​​(예를 들어, 당신은 FILE 또는 LINE을 원하는) 매크로 매우 신중하게 명명 규칙 부스트의 모든 대문자를 권장하기 때문에, 프로젝트의 이름으로 시작하여 (여기 BOOST_) 라이브러리를 사용하는 동안 (일반적으로) 특정 영역 (라이브러리)의 이름 다음에 의미있는 이름이 표시됩니다.

+0

"유형 안전"은 무엇이해야합니까? 그의 한정어의 순서는 값의 타입이 불변 인 것을 가리킨다. 그렇지만 그것은 상수가 아니다. const는 포인터에 적용해야합니다. – CodaFi

+0

또한 #define을 사용하면 전처리 기가 구문을 인식하지 못하기 때문에 코드를 잘못 범할 위험이 있습니다. –

+0

@believe_anky 전 처리기가 형식을 인식하지 못한다는 것을 의미합니까? int 또는 string.is 일 수 있습니다. – Apoorv

관련 문제