关于NSArrayI 和 NSArrayM

今天特别奇葩一个问题,让我认清了NSArrayI 和 NSArrayM相对应的是什么。

因为在保存文件数据时,控制台打印输出的class类是__NSArrayM。。。。而我判断的却是NSArray,所以无论如何都没进判断。。。这才百度,知道了错误点在哪。。。

NSArrayI   ----> NSArray                    NSArrayM ----- > NSMutableArray

之前也遇到一个问题,在加载更多数据的时候,出现了这样的一个问题

-[__NSArrayI addObjectsFromArray:]: unrecognized selector senttoinstance0x7fa1049b8f40'


排查后发现是__NSArrayI的问题,NSArrayI是NSArray,而__NSArrayM才是NsMutableArray,可是我记得我定义的时候是NSMutableArray,最后追踪代码后发现我在第一次赋值时用的是copy,而copy之后的副本都是不可变的,但是编译器不会报错,只有在运行时才会崩溃,所以就引发了上面的问题,下次一定要小心再小心

对于copy和mutableCopy来说,都可以复制可变对象或者不可变对象的引用(复制引用属于浅拷贝),复制后的数组称为副本。

总结

1.副本类型来看

只要副本是NSArray数组,原数组不管可变不可变,副本不可变(现象时提示都没有,编译时不会通过)

如果副本是NSMutableArray数组,不管原数组可变不可变

如果是以copy形式复制的,那么副本可以假象的追加数据,但实际运行就会崩溃(运行时不会通过)

如果是以mutableCopy复制,那么该副本就是可变副本

2.从复制引用的方法来看

凡是以copy复制的副本都是不可变副本

用mutableCopy复制后可以改变的前提是:副本必须是NSMutableArray数组

你可能感兴趣的:(关于NSArrayI 和 NSArrayM)