如果我有这样的C字符串:
const char* str= "hello";
我很清楚我无法更改字符串的任何字符,因为指针是常量 但如果我有这个:
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
我仍然可以使用它的方法改变对象状态 如果指针指向NSMutableString,我仍然可以改变它 那么const代表什么呢?
答案 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对象的指针是没有意义的。引用的框架方法是一种异常,可能是一种疏忽。