369

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 ? Commented Jul 26, 2011 at 13:21

3 Answers 3

959

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.

Sign up to request clarification or add additional context in comments.

11 Comments

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.
I wish I could give you ten upvotes! Thank you for your understandable and very helpful answer!
how in the earth NSString * const is a const pointer to NSString? What's their context free grammar generator?
@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).
+1. And +1000 for "Besides, NSString objects are already immutable, so making them const NSString is meaningless."
|
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 

Comments

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.