理解可变副本

时间:2013-01-16 05:56:22

标签: objective-c nsmutablearray

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

}

2 个答案:

答案 0 :(得分:2)

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

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

第二个对比/差异:

MutableCopy:与Call-by-Reference类似。

MutableDeepCopy:与Call-by-Value类似。

答案 1 :(得分:1)

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

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

深拷贝也会复制各个元素。

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

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