368

I have Constants NSString, that I want to call like:

[newString isEqualToString:CONSTANT_STRING];

Any wrong code here?

I got this warning:

sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers

How should these be declared?

1
  • 2
    how are these strings defined ?
    – user756245
    Jul 26, 2011 at 13:21

3 Answers 3

956

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.

11
  • 3
    You said the former is the constant pointer to an NSString object. So that means the pointer is constant. Hence I can't reassign that to another NSString.
    – user4951
    Jul 28, 2011 at 4:02
  • 9
    I wish I could give you ten upvotes! Thank you for your understandable and very helpful answer! Jan 2, 2012 at 20:17
  • 1
    how in the earth NSString * const is a const pointer to NSString? What's their context free grammar generator?
    – user4951
    Sep 9, 2012 at 8:38
  • 7
    @Jim the problem is in you not having learnt C properly, don't blame it on others. The const qualifier applies to the term on its left, and it applies to the term on its right only if there's nothing on its left side (e. g. const char * and a char const * are non-const pointers to const char, but char *const is a const pointer to non-const char).
    – user529758
    Oct 11, 2012 at 4:29
  • 10
    +1. And +1000 for "Besides, NSString objects are already immutable, so making them const NSString is meaningless."
    – Madbreaks
    Feb 18, 2014 at 20:07
6

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
6

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

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.