由于Apress的一个例子,对于搜索条件,它有一个灵魂:它将首先获得一个可变副本并搜索该字符串,然后将删除不在该字符串范围内的对象。理解可变副本
在易变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;
}
谢谢,我还没有得到他们之间的区别?有什么区别? – Nickool
一个只复制指向相同对象的指针。另一个创建一切的副本。 – Cocoanetics