objective-c - 内存管理 : NSString's stringWithCString:encoding:

标签 objective-c c memory-management core-foundation

假设我从某个函数中获取了一个 C 字符串:

char * mystring = SomeCFunction(...);

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

如果在 Objective-C 中,我创建一个 NSString * 使用:

NSString * mynsstring = [NSString stringWithCString:mystring 
                                           encoding:NSUTF8StringEncoding];

我是否仍然负责释放原始 C 字符串?

我假设答案是肯定的,但我无法在文档中找到明确的答案 - 相反方法 (cStringUsingEncoding) 的功能虽然合理,但确实让我停顿了一下,因为它会为您处理 cString 释放。

如果答案是肯定的,那么我是否还要负责确保在使用完 NSString * 之前我没有释放 c 字符串,或者函数是否复制字符串用于我?我问这个是因为 stringWithCString 的文档说:

Returns a string containing the bytes in a given C array, interpreted according to a given encoding.

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

最佳答案

它确实复制字节。

如果你不想复制字节,你可以使用 - (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)flag 代替。

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

关于objective-c - 内存管理 : NSString's stringWithCString:encoding:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7895152/

相关文章:

ios - Objective-C:自定义类的 NSArray?

iphone - uitableviewcell 中的 UIStepper

ios - MPMoviePlayerController.view 未从 super View 中删除

objective-c - 从 txt 文件中读取字符串到 iOS 中的 NSArrays

c - C 中的段错误

c - 在 spin_lock_init 和 DEFINE_SPINLOCK AND WHEN 之间更喜欢什么

mysql - 在 C 中追加或创建文件时如何请求连续 block (非碎片)?

c - 了解 c 中的内存分配和指针

linux - 虚拟地址空间

c++ - 什么决定了堆内存的分配位置?