답변:
상수 문자열을 다음과 같이 선언해야합니다.
NSString * const kSomeConstantString = @""; // constant pointer
대신에:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
전자는 NSString
객체에 대한 상수 포인터 이고 후자는 객체에 대한 포인터 NSString
입니다.
를 사용하면 NSString * const
kSomeConstantString을 다시 지정하여 다른 NSString
객체 를 가리킬 수 없습니다 .
이 메소드 isEqualToString:
는 유형의 인수를 예상합니다 NSString *
. 상수 문자열 ( const NSString *
)에 포인터를 전달하면 예상 한 것과 다른 것을 전달하는 것입니다.
게다가, NSString
객체는 이미 불변이므로 객체를 만드는 const NSString
것은 의미가 없습니다.
const
규정은 왼쪽에있는 용어에 적용하고,이 예는 왼쪽 (에 아무것도 없습니다 만 오른쪽에있는 용어에 적용 const char *
하고,이 char const *
const를 숯불에 const가 아닌 포인터가 있지만 char *const
const가 아닌 숯불에 const를 포인터입니다 ).
스택 오버 플로우에서 다양한 게시물에있는 한곳에 모든 것을 배치하고 나를 위해 일하기 만하면 #define은 변수 유형의 이점을 얻을 수 없기 때문에 좋지 않습니다. 기본적으로 컴파일러는 컴파일 할 때 모든 발생을 대체합니다 (필요할 때마다 Constants.h 가져 오기).
// Constants.h
#import <Foundation/Foundation.h>
@interface Constants : NSObject
extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end
// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"
@implementation Constants
NSString *APP_STATE_LOGGED_IN = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end
이것을 읽으려면 몇 분 정도 여유를 두십시오. 상수에 대한 포인터와 그 반대의 경우를 잘 읽어보십시오.