在一段时间枯燥的概念学习之后,好像记住的东西并不多,看来只有自己动手丰衣足食了。
NSString和NSMutableString
打出NS之后提示框跳出的第一个便是NSString,那就从它入手吧,既然是NSString那么首先把NS抛开,这就明朗多了,就是一个String,根据之前NSLog相当于C语言中的printf,那么NSString就是定义一个字符串咯,然后大胆的定义一个变量。
噎?居然报错了,看了一下错误信息,不是很懂,突然回想起之前的NSLog打印时的格式,瞬间恍然大悟,哈哈!!机智如我,这把还弄不对你!!于是改成了这样。
NSString str = @"Hello World!"
噎??怎么还报错!!Oh No!!再次阅读错误信息,这一次发现点击那个小红点居然能自己纠错。。。高兴中略带点尴尬。不过问题又来了,这个*是什么意思?难道定义一个字符串变量还得用指针先定义再开辟空间么??一顿尝试之后,决定还是查一查,额。。。忘了它是面向对象的语言了。好吧,那就new一下试试,果然成功了。既然发现它是一个类,那就一定有它初始化的方法,噎??那些+号所提供的方法的返回值都是instancetype,而-号所提供的返回值确没有这个类型,还有这+号和-号到底是什么??又是一个漫长的搜索过程。。。Soga!!除了instancetype还有一个类型是id,它两都是用来表示未知类型的的对象的关键字,(不过好像还有提到它两的区别:那些非关联返回类型的方法返回的类型不一样,看得有点晕,啥是关联??啥是非关联??算了,先记下来放一放吧。)+号和-号分别是用来标示该方法是类方法还是实例方法的,这下明白了好多,那既然存在实例方法和类方法,想必类方法所返回的对象相当于每次都初始化一次咯,不过还有实例方法的返回类型是NSString,其方法内部是不是也是每次都需要初始化一个对象呢??真希望能看到源码。。。不过没关系,做个实验试试。
果然三个地址是不一样的。So!!可以大胆的猜测stringByAppendingString方法的内部实现应该是
return [NSString stringWithFormat:@"%@%@",self,str];
不过每一次插入、修改、删除字符串部分内容时都需要另外开辟新的内存空间是不是有点浪费呢?好像还有个NSMutableString类,果然是继承与NSString类并且提供的实例方法的返回值是void,从字面的意思可以看出一个是普通字符串,一个是可变字符串,对于可变的字符串来说,它是如何实现不新开辟空间却能对原有的字符串进行修改的呢??好像之前学习C语言的时候也遇到过类似的情况,在C语言中函数传递参数的时候需要考虑其参数的变化值对程序接下来的操作是否有影响,然后选择是传递指针还是传递参数值。So!!!再一次大胆的猜测,对于NSMutableString来说实际上是将其指针保存下来,然后在对其进行修改。但是问题又来了,那为啥不直接用NSMutableString,而是用NSMutableString继承自NSString?暂时认定问题应该是出自它们的数据结构的不同。于是大胆的猜测,对于NSString它的数据结构应该是char[]类型,而对于NSMutableString它的数据结构应该是char类型,而它们在处理字符串修改的过程也就存在很大的差异,对于char[]类型来说,直接改变它的值会出现越界等一些问题,并且就算修改成功也只是在当前函数的作用域之内,所以需要新定义一个char[],然后将新定义的char[]返回,其内存地址发生了变化,而对于char来说,可以动态的改变它的内存空间大小,其内存地址不会改变,不过改变它的值其作用域就直接作用到指针上。虽然理解了为啥要分父类和子类,但是问题又来了,NSMutableString是继承于NSString的,那么也就是说可以将NSMutableString生成的对象直接赋予NSString对象,那么在赋值的时候是将指针告诉对方,要是我在原有的NSMutableString对象上进行修改同样的也会修改赋值过去的NSString。。。连我都能想到的问题,乔帮主一定已经解决了,果然存在一个copy的方法用来解决这个问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。