1

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() 释放字符串。(可能是因为它正在返回副本而提供建议。)

4

2 回答 2

4

常见的模式是您不应该修改不属于您的缓冲区。const文件并(在某种程度上)强制执行此操作。

至于cStringUsingEncoding:,文档说返回的缓冲区仅在您收到它的 NSString 或当前自动释放池的持续时间内有效。这意味着您拥有返回的缓冲区,因为您不希望释放它。

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

  • const char * object_getClassName(id obj)

    不通知您应该释放缓冲区,并且名称不包含任何表明您拥有缓冲区的指示。因此free(),您不这样做,也不修改它。

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

    文档明确告诉您应该释放缓冲区,并且函数名称包含说明,copy这也意味着您拥有缓冲区。因此,您可以随心所欲地修改它,而且必须free()如此。

于 2012-08-30T17:42:47.743 回答
2

事实是,结果是 const 因为

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

除此之外,即使实现不强制或要求接口设计人员可以做的事情,也将结果声明为 const ,也许是因为他希望以这种方式对待它。它为“const”有用的情况留下了优化的道路。

于 2012-08-30T17:42:25.090 回答