【问题标题】:Getting same memory address for NSStrings assigned from string literals为从字符串文字分配的 NSStrings 获取相同的内存地址
【发布时间】:2013-06-28 12:10:16
【问题描述】:

我得到以下代码 sn-p 的相同内存地址

NSString *str = @"2";

NSArray *arr = [NSArray arrayWithObjects:@"1", str, @"3", @"4", @"5", @"6", nil];

NSString *strTest = @"6";
strTest = @"2";
NSLog(@"object  %x", [arr objectAtIndex:1]);

虽然我为NSString 声明了不同的实例,但对象“str”、“strTest”和“日志打印”给出了相同的地址,那么它是如何发生的。请有人告诉我。这对我来说越来越奇怪了。

【问题讨论】:

    标签: ios objective-c nsstring


    【解决方案1】:

    strNSLog 应该提供相同的内存地址,因为它是同一个对象并且没有进行新的分配。 strTest 变量的两行可能正在由编译器优化为单个 NSString *strTest = @"2",并且由于 NSString 是不可变的,因此节省内存空间并将其指向相同的 @"2" 字符串没有问题在可执行文件的数据段中分配。

    【讨论】:

    • 发帖人可以通过打印strstrTest的地址来查看这里发生了什么。 NSLog(@"Address of str: %x, and of strTest: %x", &str, &strTest) 将显示两个不同的位置,但它们的值将相同。
    • 很好,“str”和“log”打印会给出相同的地址,但如果“str”和“strTest”使用相同的内存地址,那么如果我改变“strTest”会发生什么“str”都将得到改变?
    • strstrTest 是指针,你应该传递它们自己而不是它们的地址(这会给你一个堆栈上的内存地址。
    • 由于strstrTest 是不可变的,您不能只更改str。要更改它,您必须为其设置一个新值,这将更改 str 以指向新的内存位置。
    【解决方案2】:

    这没有问题,因为它们是字符串文字。 str 和 strTest 确实有两个不同的地址。他们只是碰巧引用了同一个对象,这是一个字符串文字。您尚未创建它们的两个单独实例。

    试试

    str = [NSString stringWithFormat:"%@", @"2"]; 
    strTest = [NSSTring stringWithString:str];
    

    左右。 但是,如果你仍然这样做

    NSArray *arr = [NSArray arrayWithObjects:@"1", str, @"3", @"4", @"5", @"6", nil];
    

    然后

    NSLog(@"object  %x", [arr objectAtIndex:1]); 
    

    您将看到arr 中索引为1 的对象和str 所指的对象是一个相同的实例,因为它们是并且它们应该是相同的。

    【讨论】:

      【解决方案3】:

      像@"2" 这样的字符串字面量永远不会被释放,它们指向同一个内存,这意味着指针比较是正确的并且它们共享相同的地址。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多