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()释放字符串。 (可能是它的建议,因为它正在返回副本。)
答案 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因为
除此之外,即使实现没有强制执行或要求接口设计者可以做的事情,声明结果为const,也许是因为他希望以这种方式对待它。并且它保留了路径,以便在“const”有用的情况下优化事物。