【问题标题】:Objective-c pointers and NSStringObjective-c 指针和 NSString
【发布时间】:2011-04-08 21:53:04
【问题描述】:

如果我有这段代码,为什么 textview 的文本没有更新?据我所知,* 表示指针,我没有复制。

NSString *searchText = myTextView.text;

searchText = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"];

那么为什么 myTextView 的文本没有像我一样改变:

myTextView.text = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"];

我将如何编写代码,以便第一个代码示例按我的意图工作?

【问题讨论】:

    标签: iphone objective-c pointers


    【解决方案1】:

    方法 stringByReplacing... 不改变字符串,它返回一个新的字符串对象(自动释放,根据命名约定)。所以在第二行代码之后,searchText 指向了一个完全不同的 NSString 对象。

    此外,NSString 对象不能更改,因为有 NSMutableString

    【讨论】:

      【解决方案2】:

      如果您希望修改myTextView.text,您必须像第二个示例一样编写它,并为您尝试修改的属性分配一个新值。为其他变量或属性分配一个新值并不能完成这项工作——“spooky action at a distance”可能会在我们最终拥有量子计算时起作用,但我们还没有。 :-)

      稍微扩展一下:是的,searchText 是一个指针。但是myTextView.text 也是如此,当您执行“searchText = myTextView.text”时,您并没有在两者之间建立任何持久的关系——您所做的只是使searchText 指向与myTextView.text 相同的目标.在此之后更改其中任何一个都不会影响另一个。因此,当您将stringByReplacing... 的结果分配给searchText 时,您将只有它指向不同的目标。

      【讨论】:

      • 谢谢你,你最后一段在答案中最有意义。在执行searchText = myTextView.text 时,我正在更改 searchText 指向的位置,而不是更改 searchText 指向的内容。有没有办法改变searchText指向的内容?
      • 仅当 searchText 指向 NSMutableString 实例时 - NSString 的内容不能更改。
      【解决方案3】:

      您的第二个示例调用“text”属性的设置器。

      您的第一个示例获取字符串的指针,然后在同一范围内更改指针。因此,“文本”没有改变。

      顺便说一句:根据您的属性的定义方式,您使用的 setter 将复制、保留或分配您给 setter 的值。因此,如果您使用以下内容:

      @property(copy) NSString* text;
      

      那么是的,setter 会在你调用时复制你给它的值:

      myTextArea.text = //some string
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多