Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is a better practice when defining a const NSString object in objective-c?

When i read colleagues' code in my team, i usually found there were two different types of definition for const NSString objects:

static NSString const * and static NSString * const

As far as i know, the former is a pointer point to a const NSString object, and the latter defines a const pointer to a NSString object.

My question is which is a better programming practice and a preferred way when defining a const NSString object in objective-c?

Thx.

like image 603
dadacomeon Avatar asked May 02 '15 09:05

dadacomeon


People also ask

How do you declare a constant variable in Objective C?

You should create a header file like: // Constants. h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT NSString *const MySecondConstant; //etc.

What does Const do in Objective C?

The constants refer to fixed values that the program may not alter during its execution. These fixed values are also called literals. Constants can be of any of the basic data types like an integer constant, a floating constant, a character constant, or a string literal.


1 Answers

Generally,

static NSString * const

is a better choice.

Actually, static NSString const * is same to static NSString *, cause the string here is already immutable. If you analyse it deeper, you'll notice that const is absolutely nothing to do with it, NSString is Objective-C's class, it wraps the actual value in C.

Note: NSString is a constant type itself (there's a NSMutableString exists). You only need to define a const pointer for it if u want it to be a constant.


EDIT

static NSString * const var;       // 1
static NSString const * const var; // same to 1, first const is useless
static const NSString * const var; // same to 1, first const is useless

CANNOT do any modification.

static NSString * var;              // 2
static NSString const * var;        // same to 2, the const is useless
static const NSString * var;        // same to 2, the const is useless

CANNOT modify the value of var, but CAN modify the pointer.

static NSMutableString * const var; // 3

CAN modify the value of var, but CANNOT for the pointer.

static NSMutableString * var; // 4

CAN modify both the value & pointer.


EDIT 2

As @user3125367 mentioned,

Immutability in Objective-C terms has nothing to do with constness in C.
...
There are 3 orthogonal things: pointer constness, object field constness and object's high-level mutability.

I agree with him about it. NSString has a higher level (it also inherited form NSObject), const on it should have no effect in fact (not the same meaning about the "no effect on immutable object"). But the complier might take care of it already.

NOTE:

var = @"a";  
var = @"b";  

the code snippet above means the pointer changed, not the value. There's no way to modify the value of NSString instance (for NSMutableString, you can use some methods like -appendString: to modify the value).

If you use

static NSString const * var;

the final var will point to @"b". Instead, if you use

static NSString * const var;

compiler will throw an error, and it's what we want: making the var unchangeable.

like image 67
Kjuly Avatar answered Nov 15 '22 07:11

Kjuly