2012-08-30 91 views
1

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

cStringUsingEncoding:

返回的C字符串被保证是唯一有效,直到该 接收机被释放时,或直到当前自动释放池被清空, 以先到者为准。

我认为库遵循const指针的常见做法;预计不会被修改或发布。

从Objective-C运行时;

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

char * method_copyArgumentType(方法方法,无符号整型索引) - 必须使用free()释放字符串。 (可能是它的建议,因为它返回一个副本。)

回答

4

常见的模式是,你不应该修改你不拥有的缓冲区。 const文件和(稍微)执行此操作。

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

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

  • const char * object_getClassName(id obj)

    不告诉你,你应该释放缓冲区,并且名称不包含任何迹象表明,你拥有缓冲区。所以你不要free()它,你不修改它。

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

    该文档明确地告诉你,你应该释放缓冲区和函数名称中包含搬弄是非copy这也意味着你自己的缓冲区。因此你可以修改所有你想要的,并且必须free()它。

+0

所以它是关于const正确性的;可修改性和大多数所有权,我说得对吗? – lockedscope

+0

是的,根据其可修改性,代码是常量正确的,由其所有权决定。 –

+0

但是我们如何从所有权得出关于可修改性的结论?(如果我们讨论的是内存中的规则,则可修改性和所有权afaik之间没有关系。) – lockedscope

2

事情是,结果是常量,因为

  • 修改它不会改变字符串本身,而CString的真的只是为了是字符串的不同表示
  • 只要字符串不更改,它可能会一次又一次地返回相同的cString。

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

+0

对于第一种选择,我们从DOCO和方法签名:字符串是不同的表示理解,但如果方法调用与内部表示的相同的编码(或某些其他原因),那么它可能返回的参考内部NSString缓冲区。因此它在概念上必须是不可修改的,对吗? – lockedscope

+0

你究竟想用这个来表达什么:“修改它不会改变字符串本身,而cString实际上只是表示字符串的不同表示”?只有当我们在你的下一个陈述中考虑它时,它才有意义。否则,当我们单独考虑时,我们可能会问:如果它是一个不同的表示,为什么它需要是const? – lockedscope

相关问题