为什么cStringUsingEncoding:返回const char *而不是char *?

时间:2012-08-30 17:32:26

标签: objective-c c pointers const

cStringUsingEncoding:返回一个“const char *”,尽管它返回一个动态分配的C字符串(来自它的文档)。那么,const的目的是什么?我们可以通过强制转换为char *来修改返回的C字符串。

  

cStringUsingEncoding:

     

保证返回的C字符串只有在有效之前才有效   接收器被释放,或直到当前的自动释放池被清空,   以先到者为准。

我认为库遵循指针到常量的常用做法;它不会被修改或释放。

  

来自Objective-C运行时;

     

const char * object_getClassName(id obj) - 没有指定返回的字符串。

     

char * method_copyArgumentType(Method method,unsigned int index) - 必须使用free()释放字符串。 (可能是它的建议,因为它正在返回副本。)

2 个答案:

答案 0 :(得分:4)

常见的模式是您不应该修改您不拥有的缓冲区。 const文件和(有些)强制执行此操作。

至于cStringUsingEncoding:,文档说明返回的缓冲区只有从您收到它的NSString或当前自动释放池的持续时间才有效。这意味着你拥有返回的缓冲区,因为你不应该释放它。

运行时的最后两个示例遵循相同的约定:

  • const char * object_getClassName(id obj)

    不通知您应释放缓冲区,并且该名称不包含您拥有缓冲区的任何指示。因此,您不会free()它,也不会对其进行修改。

  • char * method_copyArgumentType(Method method, unsigned int index)

    文档明确告诉您应该释放缓冲区,函数名称包含tell-tale copy,这也暗示您拥有缓冲区。因此,您可以随意修改它,并且必须free()它。

答案 1 :(得分:2)

事情是,结果是const因为

  • 修改它不会改变字符串本身,而cString实际上只是表示字符串的不同表示
  • 只要字符串不变,它就可能会“一遍又一遍”地返回相同的cString。

除此之外,即使实现没有强制执行或要求接口设计者可以做的事情,声明结果为const,也许是因为他希望以这种方式对待它。并且它保留了路径,以便在“const”有用的情况下优化事物。