让我们看一个例子:
场景1:
NSString * str1 = @“Hello”; // str1指向文字字符串@“Hello”
NSString * str2 = [[NSString alloc] initWithString:str1];
NSLog(@“%p%p”,str1,str2); // str1和str2都指向同一个对象
场景2:
NSString * str3 = [[NSString alloc] initWithFormat:@“Hello”];
NSString * str4 = [[NSString alloc] initWithString:str3];
NSLog(@“%p%p”,str3,str4); // str3和str4指向不同的对象
我想知道方案1和方案2之间的区别。
答案 0 :(得分:1)
这是一个实施细节(并指出基金会可以做的优化,它不是)。
你永远不应该假设两个对象基于指针相等而相等或不相等。指针相等仅用于检查它们是否确实是同一个对象。必须使用isEqual:
来检查它们是否在语义上相同。
在幕后,Foundation知道@"Hello"
是一个常量字符串,并且从常量字符串创建第二个不可变字符串只能返回常量字符串。
假设initWithFormat:
将产生非常量字符串。优化的机会是,在解析格式字符串时,基金会可以检测到没有进行格式化,只返回常量字符串(我很惊讶它没有 - 我应该提交错误增强请求)。