【问题标题】:Change pointer to NSString in Objective-C在 Objective-C 中更改指向 NSString 的指针
【发布时间】:2012-03-04 15:17:47
【问题描述】:

我一直在用 Objective-C 进行一些试验,并注意到一些,至少对我而言,相当奇怪的行为。首先我定义一个指向 NSString 的指针并将它添加到 NSArray:

NSString *s = @"A";
NSArray *a = [NSArray arrayWithOject: s];

然后我打印出 s 的值以及 a 的内容:

NSLog(@"%@", s);
NSLog(@"%@", myArray);

在这两种情况下,输出都是 A。现在,如果我改变指针 s,比如说

s = @"B";

然后两个 NSLog 语句分别打印出 B 和 A。

也就是说,我的数组中的指针仍然指向@"A"。在用 Java 编码多年后,这让我感到非常惊讶。我在这里错过了一些真正重要的东西吗?

谢谢, 迈克尔·克努森

【问题讨论】:

    标签: objective-c pointers nsstring


    【解决方案1】:

    理解这一点的最简单方法是 @"A" 创建一个新的 NSString 对象。

    在您的代码中,您将指针 s 设置为指向该对象,然后将原始对象(不是指针)添加到数组中。然后,您将指针指向的地址更改为新地址。

    如果您想更改原始对象,请使用 NSMutableString 并修改实际对象(而不是更改指向新对象的指针),它们都会按照您的预期进行更新。

    试试:

     NSMutableString *s = @"A";
     // Add to array
     [s setString:@"B"]
    

    【讨论】:

      【解决方案2】:

      这是因为 NSStrings 是不可变的,就像在 Java 中一样,所以你没有改变存储在地址 x(nsarrsy 的那个)的对象的内容,你将 s 指向地址 y。

      【讨论】:

      • 我尝试过使用可变字符串:NSMutableString *s = [NSMutableString stringWithFormat:@"%@", @"A"];但问题仍然存在。这还值得期待吗?
      • 是的,然后执行:[s setString:@"B"];
      • 所以每当我添加一个指向 NSArray 的指针时,它实际上会复制那个指针?
      • @Michael:我认为我的回答解释了它在做什么。您正在将原始对象添加到数组中,而不是指针。
      • 您正在添加指针,没有副本。有保留,但那是另一回事。那么如果你让 s 指向另一个地方,这并不意味着数组也会改变它的指针......
      【解决方案3】:

      Java 和 Objective-C 的行为是相同的。使用以下 Java 代码:

      String foo = "foo";
      
      Vector myVector = new Vector();
      myVector.add(foo);
      
      System.out.println(foo);
      System.out.println(myVector);
      
      foo = "bar";
      
      System.out.println(foo);
      System.out.println(myVector);
      

      打印出以下值:

      foo
      [foo]
      bar
      [foo]
      

      注意:如果我使用 String[] 而不是 Vector,也是如此,但 NSArray 更像 Vector 而不是 String[]。

      【讨论】:

      • 谢谢!我猜我还是对指针有点困惑(在 Java 中从来没有这样想)。
      【解决方案4】:

      查看这一点的最简单方法是查看您的 s = @"B"; 只是将 s 指向另一个字符串对象,而不是修改原始对象。

      所以数组仍然包含@"A"。当您将对象添加到 NSArray 时,您只需在 NSArray 中创建一个指向 @"A" 的指针。这永远不会改变。

      【讨论】:

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