了解NSString的initWithBytes

Dav*_*ave 6 objective-c

假设"someData"是包含一些字节数据的NSMutableData.

如果我写下面的内容:

NSString *someString = [NSString string];
[someString initWithBytes:[someData mutableBytes] length:[someData length] encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

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

但如果我写:

NSString *someString=[[NSString alloc] initWithBytes:[someData mutableBytes] length:[someData length] encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

然后它工作.前一种方式不起作用是有原因的吗?可以在没有"alloc"的情况下完成(事先创建someString吗?)

谢谢.

Jer*_*myP 5

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

不仅如此,NSString是一个类集群。这意味着当您请求NSString时,实际上可能会获得其子类之一的实例。我的猜测是,您得到的子类已-initWithBytes:length:encoding:被重写以引发异常,因为将init方法发送给在编译时创建的常量字符串是没有意义的。

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