Objective c 为什么cstringusingencode:返回常量char*而不是char*?
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()释放字符串。(可能是因为它正在返回一份副本而提供建议。)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
事实是,结果是常数,因为
- 修改它不会改变字符串本身,而cString实际上只是作为字符串的不同表示形式
- 只要字符串不变,它可能会“一次又一次”返回相同的cString
除此之外,将结果声明为const(即使实现没有强制执行或要求)也是接口设计师可以做的事情,可能是因为他希望以这种方式处理它。它为优化“常数”有用的情况留下了道路。事实是,结果是常数,因为
- 修改它不会改变字符串本身,而cString实际上只是作为字符串的不同表示形式
- 只要字符串不变,它可能会“一次又一次”返回相同的cString
除此之外,将结果声明为const(即使实现没有强制执行或要求)也是接口设计师可以做的事情,可能是因为他希望以这种方式处理它。它为优化“const”有用的情况提供了一条途径。常见的模式是,您不应该修改您不拥有的缓冲区<代码>常量记录并(在某种程度上)强制执行此操作 至于
cStringUsingEncoding:
,文档中说,返回的缓冲区仅在从中接收缓冲区的NSString或当前自动释放池的持续时间内有效。这意味着您不拥有返回的缓冲区,因为您不需要释放它
运行时的最后两个示例遵循相同的约定:
不会通知您应该释放缓冲区,并且该名称不包含您拥有缓冲区的任何指示。因此,您不必const char*object\u getClassName(id obj)
它,也不必修改它free()
文档明确告诉您应该释放缓冲区,函数名包含指示灯char*方法\u copyArgumentType(方法方法,无符号整数索引)
,这也意味着您拥有缓冲区。因此,您可以随意修改它,并且必须copy
itfree()
cStringUsingEncoding:
,文档中说,返回的缓冲区仅在从中接收缓冲区的NSString或当前自动释放池的持续时间内有效。这意味着您不拥有返回的缓冲区,因为您不需要释放它
运行时的最后两个示例遵循相同的约定:
不会通知您应该释放缓冲区,并且该名称不包含您拥有缓冲区的任何指示。因此,您不必const char*object\u getClassName(id obj)
它,也不必修改它free()
文档明确告诉您应该释放缓冲区,函数名包含指示灯char*方法\u copyArgumentType(方法方法,无符号整数索引)
,这也意味着您拥有缓冲区。因此,您可以随意修改它,并且必须copy
itfree()