mark一下知乎大佬对这个问题对探讨:NSString为何要用copy?而不是strong?
NSmutable构建二维数组时,通过addObject向可变数组_listArray中添加数组,要求每5个元素形成一个可变数组添加到_listArray中,_listArray第一个元素应该有五个元素,但第二次添加时第一个元素改变了,思考原因:浅拷贝造成的。
实际上,addObject方法是把[temp copy] 出的数组作为_listArray一部分,使temp引用计数加一 ,removeAllObjects使引用计数减1。
正确方法1:
注意此时_listArray元素类型为不可变类型。
正确用法2:
NSArray *array = [UIFont familyNames];
_fontsArray = [[NSMutableArray alloc] initWithCapacity:13];
NSMutableArray *temp = nil;
for (int index = 0; index < [array count]; index++) {
// 取出字体内容
NSString *font = array[index];
if (index % 5 == 0) {
temp = [[NSMutableArray alloc] initWithCapacity:5];
[_fontsArray addObject:temp];
[temp release];
} // 将5整除时,创建temp数组,添加到_fontsArray
[temp addObject:font];
}
此时,temp通过addObject 成为_fontsArray的一部分,temp addObject:font改变时,_fontArray也跟着改变。(巧妙👍👍👍)
与方法一比较,不需要通过Copy拷贝一份对象。
copy
copy拷贝出来的对象类型总是不可变类型(例如, NSString
, NSArray
, NSDictionary
等等)
mutableCopy
mutableCopy拷贝出来的对象类型总是可变类型(例如, NSMutableString
, NSMutableArray
, NSMutableDictionary
等等)