上图是定义一个不可数对象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却不会。
网友评论