“sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers” warning

青春壹個敷衍的年華 提交于 2019-12-02 13:46:34
albertamg

You should declare your constant string as follows:

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

instead of:

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

The former is a constant pointer to an NSString object, while the latter is a pointer to a constant NSString object.

Using a NSString * const prevents you from reassigning kSomeConstantString to point to a different NSString object.

The method isEqualToString: expects an argument of type NSString *. If you pass a pointer to a constant string (const NSString *), you are passing something different than it expects.

Besides, NSString objects are already immutable, so making them const NSString is meaningless.

just to put all on one place which found on various post on stackoverflow and works for me , #define is bad because you cannot benefit from variable types, basically the compiler replaces all occurrence when compiles (import Constants.h whenever you need) :

//  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

spare few minutes to read this. A goodread on pointers hell on constants and vice-versa.

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!