Objective c 为什么cstringusingencode:返回常量char*而不是char*?

Objective c 为什么cstringusingencode:返回常量char*而不是char*?,objective-c,c,pointers,constants,Objective C,C,Pointers,Constants,cStringUsingEncoding:返回一个“const char*”,尽管它返回一个动态分配的C字符串(来自它的文档)。那么,const的目的是什么?我们可以通过强制转换为char*,简单地修改返回的C字符串 cstringusingencode: 返回的C字符串保证仅在 接收器被释放,或直到当前自动释放池被清空, 以先到者为准 我认为图书馆正在遵循指针指向常量的惯例;预计它不会被修改或发布 来自Objective-C运行时的 const char*object\u getClassNa

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

cstringusingencode:

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

我认为图书馆正在遵循指针指向常量的惯例;预计它不会被修改或发布

来自Objective-C运行时的

const char*object\u getClassName(id obj)——未指定有关返回字符串的任何内容

char*method\u copyArgumentType(method-method,unsigned int-index)——必须使用free()释放字符串。(可能是因为它正在返回一份副本而提供建议。)


事实是,结果是常数,因为

  • 修改它不会改变字符串本身,而cString实际上只是作为字符串的不同表示形式
  • 只要字符串不变,它可能会“一次又一次”返回相同的cString

除此之外,将结果声明为const(即使实现没有强制执行或要求)也是接口设计师可以做的事情,可能是因为他希望以这种方式处理它。它为优化“常数”有用的情况留下了道路。

事实是,结果是常数,因为

  • 修改它不会改变字符串本身,而cString实际上只是作为字符串的不同表示形式
  • 只要字符串不变,它可能会“一次又一次”返回相同的cString

除此之外,将结果声明为const(即使实现没有强制执行或要求)也是接口设计师可以做的事情,可能是因为他希望以这种方式处理它。它为优化“const”有用的情况提供了一条途径。

常见的模式是,您不应该修改您不拥有的缓冲区<代码>常量记录并(在某种程度上)强制执行此操作

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

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

  • const char*object\u getClassName(id obj)

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

  • char*方法\u copyArgumentType(方法方法,无符号整数索引)

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


常见的模式是,您不应该修改您不拥有的缓冲区<代码>常量记录并(在某种程度上)强制执行此操作

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

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

  • const char*object\u getClassName(id obj)

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

  • char*方法\u copyArgumentType(方法方法,无符号整数索引)

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


所以它是关于常量正确性的;可修改性,主要是所有权,对吗?是的,根据其所有权决定的可修改性,代码是常量正确的。但我们如何从所有权得出可修改性的结论?(如果我们讨论的是内存mngmnt规则,那么可修改性和所有权之间没有关系。)公开这样的原始缓冲区,同时允许对其进行修改,会破坏封装,因为缓冲区可以在所有者的实现之外进行更改。虽然技术上可行,但这并不可取。该代码使用const.Ok显式表示不变性。因此,我们可能不知道它是否使用与内部表示相同的缓冲区,并且允许对其进行修改会破坏封装;可修改性,主要是所有权,对吗?是的,根据其所有权决定的可修改性,代码是常量正确的。但我们如何从所有权得出可修改性的结论?(如果我们讨论的是内存mngmnt规则,那么可修改性和所有权之间没有关系。)公开这样的原始缓冲区,同时允许对其进行修改,会破坏封装,因为缓冲区可以在所有者的实现之外进行更改。虽然技术上可行,但这并不可取。该代码使用const.Ok显式表示不变性。所以我们可能不知道它是否使用相同的buff