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、削除せずにそれらのキー全体が再び返される可能性が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;

}
4

2 に答える 2

2

どちらにもいくつかの比較機能と対比機能があります...

最初の比較: どちらも変更可能で、オブジェクト自体を変更できます。

2 番目の対照/相違点:

MutableCopy: Call-by-Reference に似ています。

MutableDeepCopy: Call-by-Value に似ています。

于 2013-01-16T07:04:20.360 に答える
1

コンテナー (NSArray など) のコピーは、オブジェクトへのポインターのみをコピーし、それらを保持します。

mutableCopy は同じことを行いますが、結果のコンテナーは変更できます。つまり、ポインターを追加または削除できます。

ディープ コピーでは、個々の要素のコピーも作成されます。

たとえば、NSMutableString インスタンスの NSArray を考えてみましょう。配列自体を変更することはできませんが、変更可能な各文字列を変更することはできます。配列をコピーして文字列の 1 つを変更すると、コピーされた配列にも変更が含まれます。これは、ポインターが最初の配列と同じインスタンスを指しているためです。

配列をディープ コピーして可変文字列を変更しても、新しい配列要素は変更されません。実際、copy は常に不変のコピーを作成します。

于 2013-01-16T06:30:42.373 に答える