【问题标题】:Issues of pointing to same or different objects指向相同或不同对象的问题
【发布时间】:2016-09-26 19:43:48
【问题描述】:

我们来看一个例子:

场景 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指向不同的对象

我想知道场景一和场景二的区别。

【问题讨论】:

    标签: objective-c dynamic-memory-allocation


    【解决方案1】:

    这是一个实现细节(并表明 Foundation 可以做的优化,但它不是)。

    您永远不应该根据指针相等性假设两个对象相等或不相等。指针相等仅用于检查它们是否是字面上相同的对象。 isEqual: 必须用于检查它们在语义上是否相同。

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

    假设initWithFormat: 将产生一个非常量字符串。优化的机会是,Foundation 可以在解析格式字符串期间检测到没有完成格式化并只返回常量字符串(我有点惊讶它没有——我应该提交一个 bug增强请求)。

    【讨论】:

    • 所以你想告诉我这是一个错误?
    • @Symon:不,他不是这么说的。这是一个实现细节。对于您可以想象的任何字符串类型的表达式,如果结果与某个现有的字符串对象具有相同的值,那么实现生成相同的对象是 possible*/*legal*/*valid地址)。它也可以/合法/有效地生成一个单独的对象。你不能依赖它做一个或另一个,具体来说。
    • @Symon Nope;不是错误。轻微错过的性能优化。以及肯所说的话; 你不能假设指针不等式意味着对象不等式
    猜你喜欢
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多