NSString的奇怪错误:选择器'stringWithBytes:length:encoding:'没有已知的类方法

时间:2014-01-06 18:28:35

标签: objective-c nsstring nsstringencoding

我正在尝试使用scanf为NSString分配一个值,根据Omar对 this question 的回答。这是代码,直接来自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>

3 个答案:

答案 0 :(得分:4)

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];

答案 1 :(得分:2)

NSString不响应选择器stringWithBytes:length:encoding:。您可能想要initWithBytes:length:encoding:

答案 2 :(得分:0)

简而言之:您可能想为您的 NSString 对象考虑一个适合 const char C-string 的初始化程序。此外,在向 NSString 对象发送任何初始化消息之前分配内存。我希望是这样的:

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

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

请注意,每个设计的 initWithCString 仅支持正确以 null '\0' 结尾的 8 位字符数组。对于未终止的字节数组,您可以使用 initWithBytes:length:encoding: 代替。

对于 Unicode 字符,您可以考虑 initWithCharactersNoCopy:length:freeWhenDone: