Programming

“ 'const NSString *'을 'NSString *'유형의 매개 변수로 보내면 한정자가 삭제됩니다. "경고

procodes 2020. 3. 2. 13:18
반응형

“ 'const NSString *'을 'NSString *'유형의 매개 변수로 보내면 한정자가 삭제됩니다. "경고


상수 NSString이 있는데 다음과 같이 호출하려고합니다.

[newString isEqualToString:CONSTANT_STRING];

여기에 잘못된 코드가 있습니까?

이 경고가 나타납니다.

'NSString *'유형의 매개 변수에 'const NSString *'을 전송하면 규정자가 삭제됩니다.

이것들은 어떻게 선언되어야합니까?


상수 문자열을 다음과 같이 선언해야합니다.

NSString * const kSomeConstantString = @""; // constant pointer

대신에:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

전자는 NSString객체에 대한 상수 포인터 이고 후자는 객체에 대한 포인터 NSString입니다.

를 사용하면 NSString * constkSomeConstantString을 다시 지정하여 다른 NSString객체 를 가리킬 수 없습니다 .

이 메소드 isEqualToString:는 유형의 인수를 예상합니다 NSString *. 상수 문자열 ( const NSString *)에 포인터를 전달하면 예상 한 것과 다른 것을 전달하는 것입니다.

게다가, NSString객체는 이미 불변이므로 객체를 만드는 const NSString것은 의미가 없습니다.


스택 오버 플로우에서 다양한 게시물에있는 한곳에 모든 것을 배치하고 나를 위해 일하기 만하면 #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

이것을 읽으려면 몇 분 정도 여유를 두십시오. 상수에 대한 포인터와 그 반대의 경우를 잘 읽어보십시오.

http://c-faq.com/decl/spiral.anderson.html

참고 URL : https://stackoverflow.com/questions/6828831/sending-const-nsstring-to-parameter-of-type-nsstring-discards-qualifier



반응형