1.由于我们知道的NSMutableString的内存布局之后. 我们可以创建一个数据类型和NSMutableString差不多的结构体.我们可以试试改变他的字符串长度.然后在调用appendString 然后大概猜猜他的思路.
struct stringimpl {
void *isa;
int *unknown;
char *cstring;
long long length;
};
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *str = [[NSMutableString alloc] initWithString:@"q"];
[str appendString:@"wwwwwwwwwwwwwwwwwwwwwwwwwwwww"];
struct stringimpl *hello = (__bridge struct stringimpl*)str;
hello->length= 1;
[str appendString:@"w"];
NSLog(@"%@",str);
}
看来NSMutableString是根据字符串长度拼接到最后的字符串.
我试了下修改NSString字符串的长度发现报错了. 可能是因为NSString本来也就不需要增删字符串.所以内部限制了.
2.试试修改字符串
哎,不对为啥是23不是.123呢.还是因为他的首地址有个字符串长度. 要首地址+1.
3.测试NSMutableString字符串在堆区 由前半部分得知一开始NSMutabieString会开辟36个内存空间字节. 那么我们拷贝的时候直接超出字符串34字符. 让字符串越界直接覆盖其他内存区域.这也是为什么要开辟新的内存空间的原因. 因为久的内存空间发不下.如果不开辟新的内存空间去存放更多内存区域.就会造成字符串越界导致覆盖其他区域的数据.造成崩溃或者数据异常.
最后崩溃了.显示在NSMutableString的时候字符串开辟的是在堆区.
4.测试NSMutableString字符串在堆区 我们都知道在c语言开辟内存空间是malloc.那么释放内存空间的话是free.
释放之后.到方法结束就崩溃了. 因为编译器会帮你处理字符串的内存回收.所以手动调用会出问题.
使用NSString的话 free会直接崩溃. 可能因为是字符串常量的关系.
当然这些都是我的猜想.哪里有说错的地方.还望多多包涵.