Странная ошибка с NSString: нет известного метода класса для селектора 'stringWithBytes:length:encoding:'

Я пытаюсь использовать scanf для присвоения значения NSString в соответствии с ответами на этот вопрос Омара. Это код, взятый прямо из ответа progrmr:

char word[40];

        int nChars = scanf("%39s", word);   // read up to 39 chars (leave room for NUL)
        NSString* word2 = [NSString stringWithBytes:word
                                             length:nChars
                                           encoding:NSUTF8StringEncoding];

Однако я получаю сообщение об ошибке в последней строке, которая не имеет для меня абсолютно никакого смысла:

No known class method for selector 'stringWithBytes:length:encoding:'

Что в мире может быть причиной этой ошибки?

И да, у меня есть #import <Foundation/Foundation.h> вверху файла.


person James Dunn    schedule 06.01.2014    source источник
comment
Вы смотрели справочные документы для NSString? Указан ли такой метод?   -  person rmaddy    schedule 06.01.2014


Ответы (3)


NSString не имеет метода класса stringWithBytes:length:encoding:, но вы можете использовать

NSString* word2 = [[NSString alloc] initWithBytes:word
                                         length:nChars
                                       encoding:NSUTF8StringEncoding];

Однако обратите внимание, что scanf() возвращает количество отсканированных элементов, а не количество отсканированных символов. Таким образом, nChars будет содержать 1, а не длину строки, поэтому вместо этого вы должны установить nChars = strlen(word).

Более простая альтернатива (как также упоминается в одном ответе на связанный вопрос)

NSString* word2 = [NSString stringWithUTF8String:word];
person Martin R    schedule 06.01.2014

NSString не отвечает на селектор stringWithBytes:length:encoding:. Вы, вероятно, хотели initWithBytes:length:encoding:.

person Chuck    schedule 06.01.2014
comment
Самое смешное, что вы рекомендовали +[NSString stringWithBytes:length:encoding:] в ответе на связанный вопрос :-) - person Martin R; 06.01.2014
comment
@MartinR: Да, прошлое снова наносит удар! Также странно, что prgrmr сделал ту же ошибку. Боюсь, моя утечка мозгов заразна. Тем не менее, спасибо, что указали на это. - person Chuck; 06.01.2014
comment
Я получаю ту же ошибку с initWithBytes. Изменить Неважно, это работает, когда я меняю NSString на [NSString alloc]. - person James Dunn; 06.01.2014
comment
Я просто не удержался, когда это заметил, и очень надеюсь, что вы не обиделись на мой комментарий. - person Martin R; 06.01.2014
comment
@MartinR: Без обид. Это был отличный улов. Я посмеялся и поправил. - person Chuck; 06.01.2014

Вкратце: вы можете рассмотреть подходящий инициализатор C-строки const char для вашего объекта NSString. Кроме того, выделяйте память перед отправкой любого сообщения инициализатора объекту NSString. Я бы ожидал что-то вроде:

char word[40];
int nChars = scanf("%39s", word);

NSString *word2 = [[NSString alloc] initWithCString:word encoding:NSASCIIStringEncoding];

Обратите внимание, что initWithCString для каждого проекта поддерживает только 8-битные символьные массивы с нулевым символом в конце '\0'. Для незавершенных массивов байтов вместо этого используется initWithBytes:length:encoding:.

Для символов Unicode вы можете использовать initWithCharactersNoCopy:length:freeWhenDone:.

person Anthony    schedule 03.01.2021