NSMutableString如何正常工作?

Tal*_*ode 4 cocoa objective-c

我知道NSString的所有实例都是不可改变的.如果为字符串分配新值,则会寻址新内存,旧字符串将丢失.

但是如果使用NSMutableString,无论你做什么,字符串都会在内存中保持相同的地址.

我想知道这究竟是如何运作的.使用像replaceCharactersInRange这样的方法,我甚至可以为字符串添加更多字符,因此我需要更多内存用于字符串.内存中跟随字符串的对象会发生什么?它们都被重新安置并放在内存中吗?我不这么认为.但究竟发生了什么?

bbu*_*bum 11

我知道NSString的所有实例都是不可改变的.如果为字符串分配新值,则会寻址新内存,旧字符串将丢失.

这不是可变性如何工作,也不是对NSStrings的引用如何工作.指针也不起作用.

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

在这些方面,运行时间之间确实没有区别:

NSString *a;
NSMutableString *b;
Run Code Online (Sandbox Code Playgroud)

两者都引用 - 内存中的某些分配地址.唯一的区别是在编译期间,b将被区别对待a,如果您NSMutableString在调用时使用方法b(但在调用时a),编译器不会抱怨.

至于如何NSMutableString工作,它在内部包含一个包含字符串数据的缓冲区(或几个缓冲区 - 实现细节).当您调用其中一个改变字符串内容的方法时,可变字符串将根据需要重新分配其内部存储以包含新数据.

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

我建议您重新阅读Objective-C编程指南,或者可能是C编程手册.