指向相同或不同对象的问题

时间:2016-05-28 15:40:15

标签: objective-c dynamic-memory-allocation

让我们看一个例子:

场景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之间的区别。

1 个答案:

答案 0 :(得分:1)

这是一个实施细节(并指出基金会可以做的优化,它不是)。

你永远不应该假设两个对象基于指针相等而相等或不相等。指针相等仅用于检查它们是否确实是同一个对象。必须使用isEqual:来检查它们是否在语义上相同。

在幕后,Foundation知道@"Hello"是一个常量字符串,并且从常量字符串创建第二个不可变字符串只能返回常量字符串。

假设initWithFormat:将产生非常量字符串。优化的机会是,在解析格式字符串时,基金会可以检测到没有进行格式化,只返回常量字符串(我很惊讶它没有 - 我应该提交错误增强请求)。