在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;
因为 static
和const
是NSString指针的限定符。只有指针是 const
而不是NSString。
NSString将是常量,因为它不是可变的,但是const NSMutableString *s
不会使s可变String变为常量,因此不可修改。 指向可变String的指针将是常量,编译器将不允许您修改它。
对不起反转:Ken Thomases是对的: int * const Var;
指的是指针是常量并且不能更改,但它指向的数据可以更改。 const int * Var
表示const int * Var
指向的数据无法更改。