由于来自Apress的一个例子,对于搜索条件,它有一个灵魂:它首先会获得一个可变副本并搜索该字符串,然后将删除不在该字符串范围内的对象。
在Mutable DeepCopy中它的功能如下:
@implementation NSDictionary(MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy{
NSMutableDictionary *returnDict=[[NSMutableDictionary alloc]initWithCapacity:[self count]];
NSArray *keys=[self allKeys];
for(id key in keys)
{
id oneValue=[self valueForKey:key];
id oneCopy=nil;
if([oneValue respondsToSelector:@selector(mutableDeepCopy)])
oneCopy=[oneValue mutableDeepCopy];
else if([oneValue respondsToSelector:@selector(mutableCopy)])
oneCopy=[oneValue mutableCopy];
if(oneCopy==nil)
oneCopy=[oneValue copy];
[returnDict setValue:oneCopy forKey:key];
}
return returnDict;
}
@end
当我不理解任何代码时我会调试它,所以我调试了它,并且当它想要显示整个数组时,在if
语句中它将转到oneCopy=[oneValue mutableCopy];
我想知道为什么它会选择这个选择器而不是MutableDeep选择器?我完全无法理解这个功能。这个功能的主要目的是什么?
用于搜索它具有此功能
-(void)handleSearchForTerm:(NSString *)searchTerm
{
NSMutableArray * sectionsToRemove=[[NSMutableArray alloc]init];
[self resetSearch];
for(NSString * key in self.keys)
{
NSMutableArray * array=[names valueForKey:key];
NSMutableArray *toRemove=[[NSMutableArray alloc]init];
for(NSString * name in array)
{
if([name rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location==NSNotFound)
[toRemove addObject:name];
}
if([array count]==[toRemove count])
[sectionsToRemove addObject:key];
[array removeObjectsInArray:toRemove];
}
[self.keys removeObjectsInArray:sectionsToRemove];
[table reloadData];
}
并且为了重置搜索和恢复整个它具有以下功能。
我的问题在于self.keys
我们在handleSearchForTerm
的帮助下删除了对象,但是当我们转到resetsearch
时,它会再次返回那些整个键而不会被删除,也许我的主要问题是我可以'理解Mutablecopy
和DeepMutableCopy
。
-(void)resetSearch{
NSMutableDictionary *allNamesCopy=[self.allNames mutableDeepCopy];
self.names=allNamesCopy;
NSMutableArray *keyArray=[[NSMutableArray alloc]init];
[keyArray addObjectsFromArray:[[self.allNames allKeys]sortedArrayUsingSelector:@selector(compare:)]];
self.keys=keyArray;
}
答案 0 :(得分:2)
他们都有一些比较&对比功能...
首先比较:两者都是可变的,你可以改变对象本身。
第二个对比/差异:
MutableCopy:与Call-by-Reference类似。
MutableDeepCopy:与Call-by-Value类似。
答案 1 :(得分:1)
容器的副本(例如NSArray)仅复制指向对象的指针并将它们保留。
mutableCopy做同样的事情,但可以修改生成的容器,即可以添加或删除指针。
深拷贝也会复制各个元素。
以NSMrray NSMutableString实例为例。您无法修改数组本身,但可以更改每个可变字符串。现在,如果你复制数组并修改其中一个字符串,那么复制的数组也会有更改,因为它的指针指向与第一个数组相同的实例。
如果深度复制数组并更改可变字符串,则不会修改新数组元素。事实上,复制总是会产生不可变的副本。