代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

NSMutableString究竟是如何工作的?

  •  4
  • TalkingCode  · 技术社区  · 14 年前

    我知道NSString的所有实例都是不可变的。如果你给一个字符串赋一个新的值,新的内存被寻址,旧的字符串将丢失。

    我想知道这到底是怎么回事。使用replaceCharactersInRange这样的方法,我甚至可以向字符串中添加更多的字符,因此我需要更多的内存来存储字符串。内存中跟在字符串后面的对象会发生什么变化?他们是否都被重新安置并放在记忆中的其他地方?我不这么认为。但到底发生了什么?

    2 回复  |  直到 14 年前
        1
  •  11
  •   bbum    14 年前

    无法改变。如果指定新值 一个字符串的新内存地址 那根旧绳子就会丢了。

    这不是可变性的工作方式,也不是对nsstring的引用的工作方式。也不知道指针是怎么工作的。

    指向对象的指针-- NSString *a; 声明变量 a 这是一个指向对象的指针——只保存对象内存中的地址。实际对象[通常]是包含实际对象本身的内存堆上的分配。

    在这些术语中,以下两者在运行时实际上没有区别:

    NSString *a;
    NSMutableString *b;
    

    两者都是对内存中某些分配的地址的引用。唯一的区别是在编译时, b 将被区别对待 NSMutableString b ).

    可修改的字符串 工作时,它在内部包含一个缓冲区(或多个缓冲区——实现细节),其中包含字符串数据。当您调用改变字符串内容的方法之一时,可变字符串将根据需要重新分配其内部存储以包含新数据。

    对象不会在内存中移动。一旦分配,分配就永远不会移动——对象或分配的地址永远不会改变。唯一的半例外是当你使用 realloc() 可能会返回不同的地址。然而,这实际上只是一系列 free(); malloc(); memcpy(); .

    我建议你再去看看 Objective-C Programming Guide 或者,可能是一本C编程手册。

        2
  •  0
  •   M3t0r    14 年前

    NSMutable字符串就像C++ STD::String DO一样工作。我不知道它们到底是如何工作的,但有两种流行的方法:

    浓缩

    创建一个包含两个变量的结构。一个字符和一个指针。 添加新字符(或更多字符)时,您将创建结构的新实例,并将地址添加到字符串的最后一个结构实例。这样就有了一堆结构,指针指向下一个结构。

    复制(&A);添加

    大多数新手都会这么做。不是最坏的,但可能是最慢的。 更高级的版本是创建大小为+50的新字符串,只需添加字符和新的 null 无效的

    如前所述,我不知道std::string或NSMutableString如何处理这个问题。但这些是最常见的方法。