NSMutableArray 遇到的坑

描述

有如下排序有关的类(这里只展示了.h文件):

///线性(底层为数组)排序的基类,继承自Base,内部有一个数组
@interface LinearSort : SortBaseClass    
 
@property (nonatomic, copy) NSMutableArray *dataArr;

@property (assign) int currentI;
@property (assign) int currentJ;

@end 

成员函数没有写,我最初认为上面代码没问题(2019年 我回头看这个文章,问题很明显。。。)

坑: __NSFrozenArrayM

上面几个类的代码没问题吧?(更新:有问题。。)

我在一个函数里调用
self.dataArr = [[NSMutableArray alloc] initWithArray:array copyItems:1];
后续对这个 dataArr 进行 remove 或 add 等操作时却报错:
“message sent to __NSFrozenArrayM 类的一个实例 unrecognized selector”
大体意思我懂,不过 __NSFrozenArrayM 是什么玩意???

打印一个正常的 NSMutableArray 的信息是这样的:
<__NSArrayM 0x60800045b810>

一个NSArray是这样的:
<__NSArrayI 0x608000 *****>

M 代表 mutable 可变, I 代表 immutable 不可变
就字面意思, __NSFrozenArrayM 是一个 固定的可变数组,不冲突吗???

官方文档解释:

__NSFrozenArrayM - an immutable NSArray sharing its storage with an NSMutableArray that it was -copy’d from (will do a real copy if the original array is mutated)

“从 NSMutableArray 的 copy 函数返回的 NSArrayI,暂时与原数组共用一段内存,若原数组变化则再真正复制一次”。
这是熟悉的 copy-on-write 的概念,比如结构体的传递都是这样优化的。可能由于编译器版本更新,2019年的读者如果自己测试,很有可能打印不出来 __NSFrozenArrayM 了,直接就是 __NSArrayI,编译器可能删掉了这部分优化。

问题已经浮出水面,是 property 的 copy 在作怪。我最近偶然回头看了这篇旧文章,于是新写了一篇 copy 的正确理解 送上。想了解本文问题怎么解决的,也可以看此链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值