0

由于来自 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它会再次返回那些完整的键而没有任何删除,也许我的主要问题是我无法理解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;

}
4

2 回答 2

2

它们都有一些比较和对比功能......

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

第二个对比/差异:

MutableCopy:类似于 Call-by-Reference。

MutableDeepCopy:类似于按值调用。

于 2013-01-16T07:04:20.360 回答
1

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

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

深层副本也会复制各个元素。

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

如果您对数组进行深度复制并更改可变字符串,则不会修改新的数组元素。事实上,copy 总是制作一个不可变的副本。

于 2013-01-16T06:30:42.373 回答