在objective-c中定义const NSString对象时,有什么更好的做法?

当我在团队中阅读同事的代码时,我通常发现const NSString对象有两种不同类型的定义:

static NSString const *static NSString * const

据我所知,前者是指向const NSString对象的指针,后者定义了指向NSString对象的const指针。

我的问题是在objective-c定义const NSString对象时哪个是更好的编程习惯和首选方法?

谢谢。

通常,

 static NSString * const 

是一个更好的选择。

实际上, static NSString const *static NSString *相同,因为这里的字符串已经是不可变的。 如果你更深入地分析它,你会发现const绝对与它无关,NSString是Objective-C的类,它将实际值包装在C中。

注意NSString本身就是一个常量类型(存在一个NSMutableString )。 如果你想让它成为常量,你只需要为它定义一个const指针。


编辑

 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 

不能做任何修改。

 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 

无法修改var的值,但CAN可以修改指针。

 static NSMutableString * const var; // 3 

CAN可以修改var的值,但不能修改指针。

 static NSMutableString * var; // 4 

CAN可以修改值和指针。


编辑2

正如@ user3125367所述,

Objective-C术语的不变性与C中的常量无关。

有三个正交的东西:指针常量,对象字段常量和对象的高级可变性。

我同意他的看法。 NSString有一个更高的级别(它也从NSObjectinheritance),它上面的const应该没有效果(对“对不可变对象没有影响”的含义不一样)。 但是编译器可能已经处理好了。

注意:

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

上面的代码片段表示指针已更改,而不是值。 没有办法修改NSString实例的值(对于NSMutableString,您可以使用某些方法,如-appendString:来修改值)。

如果你使用

 static NSString const * var; 

最终的var将指向@"b" 。 相反,如果你使用

 static NSString * const var; 

编译器会抛出一个错误,这就是我们想要的:使var不可更改。

 NSString const *str 

意味着str是不可变的。如果你改变str值例如str = str2,就会出现错误。

 NSString *const str 

意味着什么str指向是不可变的。你可以改变str = str2;

因为NSString是不可变的

 NSString *const str 

等于

 NSString *str 

// Demo.h

 FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT NSString *const MySecondConstant; 

// Demo.m

 NSString *const MyFirstConstant = @"FirstConstant"; NSString *const MySecondConstant = @"SecondConstant"; 

我更喜欢static const NSString *var; 因为staticconst是NSString指针的限定符。 只有指针是const而不是NSString。

NSString将是常量,因为它不是可变的,但是const NSMutableString *s不会使s可变String变为常量,因此不可修改。 指向可变String的指针将是常量,编译器将不允许您修改它。

对不起反转:Ken Thomases是对的: int * const Var; 指的是指针是常量并且不能更改,但它指向的数据可以更改。 const int * Var表示const int * Var指向的数据无法更改。