const指定符在指向对象之前做了什么?

时间:2012-11-30 20:16:00

标签: objective-c const cllocation

如果我有这样的C字符串:

const char* str= "hello";

我很清楚我无法更改字符串的任何字符,因为指针是常量 但如果我有这个:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location

我仍然可以使用它的方法改变对象状态 如果指针指向NSMutableString,我仍然可以改变它 那么const代表什么呢?

3 个答案:

答案 0 :(得分:1)

注意区别:

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

// pointer to constant (two equivalent ways)
const char * str = "";
char const * str = "";

关键字const apply适用于其左侧的任何内容。如果左边没有任何内容,则适用于其右边的任何内容。

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

请注意,您不能拥有object类型的变量。类似NSObject o;的表达式会产生编译器错误,并显示消息“接口类型无法静态分配”。

传递对象的唯一方法是传递指针。指针作为值传递,但让方法内的代码引用对象并更改它。所以在某种程度上,就像你通过引用传递对象(实际上你是按值传递指针)。

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

const

答案 1 :(得分:1)

在该方法声明中,location是指向常量CLLocation的指针。但是当您向location对象发送消息时,const - 不会被保留;处理邮件的方法将self视为非const对象。 (请注意,这与C ++不同,C ++支持const成员函数,其中this是指向常量对象的指针。)

因此该声明中的const并不特别有用。也许它是由习惯于C ++做事的人编写的。

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

extern NSString * const SomeConstantString;

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

答案 2 :(得分:1)

  

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

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

  

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

像C ++中一样,Objective-C对象没有const正确性。编译器不关心您发送到const对象的消息(变异与否)。因此,声明指向const对象的指针是没有意义的。引用的框架方法是一种异常,可能是一种疏忽。