NSString弱持有std :: string的const char *

时间:2011-06-29 22:57:10

标签: c++ cocoa nsstring objective-c++ stdstring

NSString弱于包含属于std :: string的const char *的最安全的方法是什么?下面的两个例子都是在一个简单的测试中,在日志中,以及在NSTableView中提供的,但是我很担心一直到路上的奇怪行为。它可能是c_str()的额外空字符被简单地忽略(因为传递了长度参数)并且两者都可以正常工作。

假设:

std::string const * stdstring = new std::string("Let's see if this works");

然后:

NSString * aStr = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->data() length: stdstring->length() 
    encoding:NSUTF8StringEncoding  freeWhenDone:NO];

或:

NSString * aStr2 = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->c_str() length: stdstring->length() 
     encoding:NSUTF8StringEncoding  freeWhenDone:NO];

或其他什么?

1 个答案:

答案 0 :(得分:2)

initWithBytesNoCopy:length:...的文档明确指出length将是使用的字节数,因此将始终忽略空终止字符。因此data()c_str()返回的内存内容同样适用。

考虑到这一点:

std::string的{​​{1}}和data()函数返回的内存的生命周期保证是相同的 - 它们将一直存在,直到您在字符串对象上调用非const成员函数。内部数据结构是否已经是以空终止的字符数组,这取决于实现,因此通常c_str()的复杂性要比data()更便宜或相同。c_str()。因此,我会选择data()