Objective c 常量说明符在指向对象的指针之前做什么?

Objective c 常量说明符在指向对象的指针之前做什么?,objective-c,constants,cllocation,Objective C,Constants,Cllocation,如果我有这样一个C字符串: const char* str= "hello"; 我很清楚,我不能更改字符串的任何字符,因为指针是常量。 但如果我有这个: - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 我仍然可以使用对象的方法来改变对象状态。 如果指针指向NSMutableString,我仍然可以对其进行变异。 那么const代表什么呢 注意区别: // constant pointer char

如果我有这样一个C字符串:

const char* str= "hello";
我很清楚,我不能更改字符串的任何字符,因为指针是常量。
但如果我有这个:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
我仍然可以使用对象的方法来改变对象状态。
如果指针指向NSMutableString,我仍然可以对其进行变异。
那么const代表什么呢

注意区别:

// constant pointer
char * const str = "";

// pointer to constant (two equivalent ways)
const char * str = "";
char const * str = "";
关键字const适用于紧靠其左侧的任何对象。如果它的左边没有任何东西,那么它适用于它右边的任何东西

在Objective-C中,所有方法参数始终按值传递。这包括原语、结构、联合和指针以及任何其他组合类型

请注意,不能有object类型的变量。类似于
nso的表达式生成编译器错误,消息为“接口类型无法静态分配”

传递对象的唯一方法是传递指针。指针作为值传递,但允许方法中的代码引用对象并对其进行更改。因此,在某种程度上,这就像是通过引用传递对象(实际上是通过值传递指针)

编译Objective-C程序时,这些方法被转换为C函数,每个“消息发送”(也称为“方法调用”,尽管并不完全相同)都使用运行时函数
objc_sendMsg
运行。此函数不知道或不关心是否使用
const
限定对象。如果你想要一个不可变的对象,你必须在对象内部编写不可变的代码。例如:

// const qualifying an object is ignored whether in variables or method arguments:
const NSMutableArray *array = [NSMutableArray new];   // const is ignored
-(void)someMethod:(const NSMutableArray *)array { ... // const is ignored

// calling the methods that mutate the object works fine
[array removeAllObjects];

在该方法声明中,
location
是指向常量
CLLocation
的指针。但是当您向
位置
对象发送消息时,
常量
-ness不会被保留;处理消息的方法将
self
视为非
const
对象。(注意,这与C++支持不同,它支持代码> const < /COD>是指向常量对象的指针。) 因此,该声明中的
const
不是特别有用。可能是有人用C++来做事情的。

当您在Objective-C中看到对象指针上附加了
const
时,通常是这样的:

extern NSString * const SomeConstantString;
这将
SomeConstantString
声明为指向某个非常量对象的常量指针(在本例中为
NSString
)。指针本身是常量,因此程序无法更改
SomeConstantString
以指向其他
NSString
对象

我很清楚,我不能更改字符串的任何字符,因为 指针是常量

不,指针是可变的。它指向的字符是常量

我仍然可以使用它的方法来改变对象状态

对于C++中的对象-C对象,没有任何正确的正确性。编译器不关心向const对象发送哪些消息(是否发生变化)。因此,声明指向常量对象的指针毫无意义。引用的框架方法是一种反常现象,可能是一种疏忽