gpt4 book ai didi

objective-c - 理解 NSString 的 initWithBytes

转载 作者:太空狗 更新时间:2023-10-30 03:43:09 34 4
gpt4 key购买 nike

假设“someData”是一个包含一些数据字节的 NSMutableData。

如果我这样写:

NSString *someString = [NSString string];
[someString initWithBytes:[someData mutableBytes] length:[someData length] encoding:NSUTF8StringEncoding];

第二行给我一个“无法识别的选择器发送到实例”的错误

但是如果我写:

NSString *someString=[[NSString alloc] initWithBytes:[someData mutableBytes] length:[someData length] encoding:NSUTF8StringEncoding];

然后就可以了。有没有前一种方法不起作用的原因?可以不用“alloc”来完成吗(事先创建 someString?)

谢谢。

最佳答案

原因是[NSString string]返回的对象没有响应选择器-initWithBytes:length:encoding:。这是因为 NSString 是不可变的——它们一旦创建就无法更改。 -string 方法利用了这一点,它只为您提供一个空的常量字符串(在编译时创建)的引用。

不仅如此,NSString 还是一个类簇。这意味着当你请求一个 NSString 时,你实际上可能得​​到它的一个子类的实例。我的猜测是,您得到的子类重写了 -initWithBytes:length:encoding: 以抛出异常,因为将 init 方法发送到编译时创建的常量字符串是没有意义的。

在第二种情况下,您将在运行时创建一个全新的 NSString,然后向它发送一条初始化消息。这很好。请注意,因为它是一个类簇,init 方法返回的字符串可能与 -alloc 创建的字符串不同。

关于objective-c - 理解 NSString 的 initWithBytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795723/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com