2013-01-16 23 views
0

由于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时,它会再次返回那些没有任何移除的整个键。也许我的主要问题是我无法理解MutablecopyDeepMutableCopy

-(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; 

} 

回答

1

容器的副本(例如NSArray)只复制指向对象的指针并将它们发送给retain。

mutableCopy做同样的事情,但可以修改生成的容器,即可以添加或删除指针。

深层复制也会制作单个元素的副本。

以NSMutableString实例的NSArray为例。您不能修改数组本身,但可以更改每个可变字符串。现在,如果复制数组并修改其中一个字符串,则复制的数组也会发生更改,因为它的指针指向与第一个数组相同的实例。

如果您深拷贝数组并更改可变字符串,则不会修改新数组元素。实际上,复制总是会产生不可变的副本。

+0

谢谢,我还没有得到他们之间的区别?有什么区别? – Nickool

+0

一个只复制指向相同对象的指针。另一个创建一切的副本。 – Cocoanetics

2

他们都有一些比较&对比功能...

首先比较:两者都是可变的,你可以改变物体本身。

其次对比/差异:

MutableCopy:通话按引用类似。

MutableDeepCopy:类似于按值调用。