NSMutableArray使用copy声明所产生内存泄漏的问题

博客探讨了在Objective-C中,使用`copy`声明`NSMutableArray`时导致的错误,即`NSArray`中找不到`removeObject:`方法。文章解释了`copy`和`strong`之间的区别,`copy`会创建新的内存区域,可能导致不可变对象的意外行为。通过分析,指出使用`copy`可能会产生内存泄漏,而`strong`则不会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSMutableArray问题
上图是定义一个不可数对象mutableArray,使用copy来声明所使用的代码。

1
所报的错如上图,意为:在NSArray这样的类型中,找不到removeObject:方法。为什么会出现这样的错误呢?相反,如果使用strong来声明的话就不会出错。

综合上诉,通过思考会明显看出有两个问题:

1、为什么使用copy会报错,使用strong却不会。
2、为什么报错会报在NSArray中,无法找不到removeObject

根据这两个问题,我们就可以思考,修饰词copy和strong有什么区别呢?为什么copy后报错会是NSArray,无法找到removObject呢,是不是copy时生成了NSArray?所以解决这两个问题,我们就能知道为什么不能用copy这个关键字了
我们做iOS开发的大致都对这个了解,再科普一下这两个的关系和区别。

copy和strong的区别:copy赋值时会开辟一个新的内存区域,而 strong 则不会。使用 copy 可以防止不可变的属性被赋值的是可变的数据时,因可变数据的改变而改变属性的值
self.mutableArray = [[NSMutableArray alloc] initWithArray:@[@"1",@"2",@"3"]];

这句代码开辟内存空间赋值给self.mutableArray. 你用self.array = 是通过setter方法来给mutableArray赋值,而你又给这个setter方法设置copy(_mutableArray = [mutableArray copy]),而经过copy生成的mutableArray指针指向的是一个不可变数组,这时你在调用removeObject或add方法,肯定会出问题,并且会报出上面所出现的错误“unrecognized selector sent to instance”。所以我们应该知道为什么用copy会产生内存泄漏的问题,而strong却不会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值