NSString слабо держит const char * из std :: string - PullRequest
3 голосов
/ 30 июня 2011

Какой самый безопасный способ для NSString слабо содержать const char *, принадлежащий std :: string? Оба приведенных ниже примера работают над простым тестом, в журналах и в виде, представленном в 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 Ответ

2 голосов
/ 02 июля 2011

В документации для initWithBytesNoCopy:length:... четко указано, что length будет числом используемых байтов, поэтому нулевой символ завершения всегда будет игнорироваться. Следовательно, содержимое памяти, возвращаемое data() и c_str(), одинаково подходит.

Имея это в виду:

Гарантийный срок службы памяти, возвращаемой функциями std::string data() и c_str(), идентичен - они будут существовать до тех пор, пока вы не вызовете неконстантную функцию-член для строкового объекта. От реализации зависит, является ли внутренняя структура данных массивом символов с нулевым символом в конце, поэтому в общем случае data() будет дешевле или идентичен по сложности c_str(). Поэтому я бы пошел на data().

...