今天特别奇葩一个问题,让我认清了NSArrayI 和 NSArrayM相对应的是什么。
因为在保存文件数据时,控制台打印输出的class类是__NSArrayM。。。。而我判断的却是NSArray,所以无论如何都没进判断。。。这才百度,知道了错误点在哪。。。
NSArrayI ----> NSArray NSArrayM ----- > NSMutableArray
之前也遇到一个问题,在加载更多数据的时候,出现了这样的一个问题
-[__NSArrayI addObjectsFromArray:]: unrecognized selector senttoinstance0x7fa1049b8f40'
排查后发现是__NSArrayI的问题,NSArrayI是NSArray,而__NSArrayM才是NsMutableArray,可是我记得我定义的时候是NSMutableArray,最后追踪代码后发现我在第一次赋值时用的是copy,而copy之后的副本都是不可变的,但是编译器不会报错,只有在运行时才会崩溃,所以就引发了上面的问题,下次一定要小心再小心
对于copy和mutableCopy来说,都可以复制可变对象或者不可变对象的引用(复制引用属于浅拷贝),复制后的数组称为副本。
只要副本是NSArray数组,原数组不管可变不可变,副本不可变(现象时提示都没有,编译时不会通过)
如果副本是NSMutableArray数组,不管原数组可变不可变
如果是以copy形式复制的,那么副本可以假象的追加数据,但实际运行就会崩溃(运行时不会通过)
如果是以mutableCopy复制,那么该副本就是可变副本
凡是以copy复制的副本都是不可变副本
用mutableCopy复制后可以改变的前提是:副本必须是NSMutableArray数组