Objective c 内存管理:NSString';s stringWithCString:编码:

Objective c 内存管理:NSString';s stringWithCString:编码:,objective-c,c,memory-management,core-foundation,Objective C,C,Memory Management,Core Foundation,假设我从某个函数中得到一个C字符串: char*mystring=SomeCFunction(…) 我拥有这个字符串(完成后我负责释放它) 如果在Objective-C中,我使用以下方法创建了一个NSString*: NSString * mynsstring = [NSString stringWithCString:mystring encoding:NSUTF8StringEncoding]; 我是否

假设我从某个函数中得到一个C字符串:

char*mystring=SomeCFunction(…)

我拥有这个字符串(完成后我负责释放它)

如果在Objective-C中,我使用以下方法创建了一个
NSString*

NSString * mynsstring = [NSString stringWithCString:mystring 
                                           encoding:NSUTF8StringEncoding];
我是否仍负责释放原始C字符串?

我假设答案是肯定的,但我在文档中找不到明确的答案,相反方法(
cstringusingencode
)的功能虽然很有意义,但确实让我停顿了一下,因为它可以为您处理cString释放

如果答案是肯定的,那么我是否也有责任确保在使用
NSString*
之前不释放c字符串,或者函数是否为我复制字符串?我这样问是因为
stringWithCString
的文档中说:

返回一个字符串,该字符串包含给定C数组中的字节,并进行解释 根据给定的编码


这仍然让我怀疑它是否真的复制了字节,或者只是在内部指向它们(我基本上只是在进行转换)。

它确实复制了字节

如果不希望复制字节,可以使用
-(id)initWithBytesNoCopy:(void*)字节长度:(nsInteger)长度编码:(NSStringEncoding)编码FreeWhenOne:(BOOL)标志


如果使用
-(id)initWithBytes:(const void*)bytes length:(nsInteger)length encoding:(NSStringEncoding)encoding
,或任何本身调用此低级方法的商品方法,如
stringWithCString:encoding:
,字节被复制。

API不知道您传递它的指针来自何处,因此它不知道如何获得它的所有权。它可以来自malloc(),但也可以是内部指针或来自mmap(),在这种情况下free()不起作用。因此,API被迫复制数据


唯一可以将C缓冲区的所有权传递给Cocoa API的时间是API允许您告诉它需要释放。例如,看看
-[NSData initwithbytesnopy:length:freewwhendone:][/code>。

Ah!你真棒。非常感谢。在“接受阻止计时器”剩余的6分钟过期后,我将接受答案。@AndréFratelli我建议您提交反馈(在线文档的每一页底部都有一个链接),因此苹果会在那里添加此链接;-)+是的,这对我来说很有意义。。。有时候,我只是在苹果文档中对这样的事情有点明确,而不是让你自己去推断这些事情。在这种情况下,我犹豫了很长时间,我想我应该问一下。这很公平。提交一个bug,并要求在文档中明确地调用它。