iOS 为什么不用NSMutableArray取代NSArray
2个回答
展开全部
NSArray 和 NSMutableArray 的底层结构应该是差不多的。区别从名字就可以看到,NSArray 不可变,而 NSMutableArray 可变。NSArray 因为不可变,实现起来会更简单些。
iOS 这种设计是适当的,明确区分了不可变的数据结构和可变的数据结构。不可变有时也叫只读。 不可变是个约束限制,施加这种限制可以减少不确定性。比如:
doSomething(NSMubaleArray* array);
这样的接口,doSomething 里面就有可能修改 array 的内容,这样当使用这种函数的时候,就需要考虑数据被修改应该怎么办?是不是应该先复制一份,防止修改呢?这样就多了不确定性。而这种接口:
doSomething(NSArray* array);
就没有这个问题。
你可能会说,我在实现 doSomething 的时候小心一点,保证内部不会被修改,并且用注释说明,调用这函数的时候不会被修改,这样其它人使用的时候就不用复制了。但是这种小心是不可信的,有可能出错就一定会出错。不应该想着写注释要他人注意,而应该想办法从根源杜绝问题。
另外,不可变结构附带有如下好处:
功能单一,实现起来会更简单。
没有修改的数据的接口,就从根源防止了数据无意中被修改。
因为不会被修改,更容易被缓存复用。
因为不可变,只读,多线程访问的时候,也不会发生一边读一边写的情况,也就没有同步的问题,也就不用上锁。
闲话一句,设计类接口的时候,功能并非越多越好,不要想着接口以后可能有用就先加上,而应该想着接口现在没有必要,就直接去掉。这点可能跟初学编程的人想的不一样。有时还会嫌某个类接口太多,而会将其用另一个类封装起来,只提供少数接口。
其实不单是 iOS 开发,其它场合都会区分可变和不可变的。比如 C++ 中的 const。swift 中的 let, Java 中的 final ,打开文件指定是否可读写。这些都是施加约束限制,无限制的所谓自由意味着混乱。
知乎上看到的 我觉得解释的挺合理的
iOS 这种设计是适当的,明确区分了不可变的数据结构和可变的数据结构。不可变有时也叫只读。 不可变是个约束限制,施加这种限制可以减少不确定性。比如:
doSomething(NSMubaleArray* array);
这样的接口,doSomething 里面就有可能修改 array 的内容,这样当使用这种函数的时候,就需要考虑数据被修改应该怎么办?是不是应该先复制一份,防止修改呢?这样就多了不确定性。而这种接口:
doSomething(NSArray* array);
就没有这个问题。
你可能会说,我在实现 doSomething 的时候小心一点,保证内部不会被修改,并且用注释说明,调用这函数的时候不会被修改,这样其它人使用的时候就不用复制了。但是这种小心是不可信的,有可能出错就一定会出错。不应该想着写注释要他人注意,而应该想办法从根源杜绝问题。
另外,不可变结构附带有如下好处:
功能单一,实现起来会更简单。
没有修改的数据的接口,就从根源防止了数据无意中被修改。
因为不会被修改,更容易被缓存复用。
因为不可变,只读,多线程访问的时候,也不会发生一边读一边写的情况,也就没有同步的问题,也就不用上锁。
闲话一句,设计类接口的时候,功能并非越多越好,不要想着接口以后可能有用就先加上,而应该想着接口现在没有必要,就直接去掉。这点可能跟初学编程的人想的不一样。有时还会嫌某个类接口太多,而会将其用另一个类封装起来,只提供少数接口。
其实不单是 iOS 开发,其它场合都会区分可变和不可变的。比如 C++ 中的 const。swift 中的 let, Java 中的 final ,打开文件指定是否可读写。这些都是施加约束限制,无限制的所谓自由意味着混乱。
知乎上看到的 我觉得解释的挺合理的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询