我有一个函数,其中NSMutableDictionary由NSMutableArray的值填充。此NSMutableArray基于手指的移动存储CGPoints。当调用touchesEnded时,NSMutableArray中的值被“转移”到NSMutableDictionary中,然后它被清空。我这样做只是为了跟踪手指的移动(以及其他用途)。
这里的问题是当NSMutableArray被清空时,NSMutableDictionary也被清空。
这是我的代码:
[pointDict setObject:pointArr forKey:[NSNumber numberWithInt:i]];
//When I check if the pointDict is not empty, it works fine.
[pointArr removeAllObjects];
//Now when I check if the pointDict is not empty, it returns nothing.
谁能告诉我为什么会这样?代码有什么问题?
答案 0 :(得分:2)
当您调用setObject:forKey:
时,您只是传递指向pointArr
所指向的同一对象的指针。所以当你告诉数组removeAllObjects
时,所有的点都消失了,因为只有一个数组。
您需要在存储之前制作副本。假设您正在使用ARC,并且在将数组放入pointDict
之后无需修改数组,则可以执行此操作:
[pointDict setObject:[pointArr copy] forKey:[NSNumber numberWithInt:i]];
如果您需要保持数组的可变性,可以使用mutableCopy
代替。
如果您没有使用ARC,则需要使用release
或autorelease
在将复制的数组放入字典后对其进行声明(从copy
开始创建一个新对象,就像alloc
一样,你负责释放它。)