假设"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吗?)
谢谢.
原因是所返回的对象[NSString string]没有响应选择器-initWithBytes:length:encoding:。这是因为NSString是不可变的-创建后就无法更改。该方法-string利用了这一点,并且只为您提供了对常量字符串(在编译时创建)的引用,该常量字符串为空。
不仅如此,NSString是一个类集群。这意味着当您请求NSString时,实际上可能会获得其子类之一的实例。我的猜测是,您得到的子类已-initWithBytes:length:encoding:被重写以引发异常,因为将init方法发送给在编译时创建的常量字符串是没有意义的。
在第二种情况下,您将在运行时创建一个全新的NSString,然后向其发送初始化消息。很好 请注意,由于它是一个类集群,因此init方法返回的字符串可能与所创建的字符串不同-alloc。
| 归档时间: |
|
| 查看次数: |
5289 次 |
| 最近记录: |