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];
或其他什么?
答案 0 :(得分:2)
initWithBytesNoCopy:length:...
的文档明确指出length
将是使用的字节数,因此将始终忽略空终止字符。因此data()
和c_str()
返回的内存内容同样适用。
考虑到这一点:
std::string
的{{1}}和data()
函数返回的内存的生命周期保证是相同的 - 它们将一直存在,直到您在字符串对象上调用非const成员函数。内部数据结构是否已经是以空终止的字符数组,这取决于实现,因此通常c_str()
的复杂性要比data()
更便宜或相同。c_str()
。因此,我会选择data()
。