由于来自 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;
}