iOS/Objective-C 개발 사전 NSDictionary 의 깊이 있는 복사 (category 사용)

대상: NSDictionary 대상을 NSMutable Dictionary 대상으로 변환하고 대상 내용은 문자열 그룹으로 완전 복제(심도 복제)가 필요합니다.
NSDictionary의mutable Copy 방법을 호출하면 NSMutable Dictionary 대상을 얻을 수 있지만 이것은 얕은 복사일 뿐입니다. 만약에 우리가 NSDictionary 중의 그룹 내의 값을 수정한다면 (물론 그룹은 NSMutable Array이어야 합니다) NSMutable Dictionary 대상 내의 여러 그룹의 값도 따라서 변경된 것을 발견할 수 있습니다.심도 있는 복제를 위해 mutableDeepCopy 방법을 추가해야 합니다. 이 방법에서 모든 요소를 순환적으로 복제합니다.
이 기능을 실현하려면 두 가지 방법이 있는데 하나는 계승이고 다른 하나는 category를 사용하는 것이다.category와 계승의 차이점은 category를 사용하는 것은 새로운 클래스가 아니라 원래의 클래스를 바탕으로 몇 가지 방법(사용할 때 원래의 클래스 이름을 사용)을 추가하는 것이다. 그러면 우리는 이미 다른 원본 파일에 작성된 클래스를 수정할 필요가 없다. H 헤더 파일을 가져오고 복사 방법을 우리가 새로 추가한 방법으로 수정하면 된다.
1. 새 Objective-C category 파일, 이 Category는 Mutable DeepCopy, Category on은 NSDictionary를 채우기 때문에 생성된 파일은 NSDictionary + Mutable DeepCopy입니다.h 및 NSDictionary+Mutable DeepCopy.m, 생성된 파일 이름은 이해하기 쉽습니다.
2. 두 개의 파일 소스 코드:
NSDictionary+MutableDeepCopy.h
#import <Foundation/Foundation.h>
 
@interface NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy;
//  mutableDeepCopy  
@end

NSDictionary+MutableDeepCopy.m:
#import "NSDictionary+MutableDeepCopy.h"
 
@implementation NSDictionary (MutableDeepCopy)
-(NSMutableDictionary *)mutableDeepCopy
{
    NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];
    //    NSMutableDictionary  ,    NSDictionary     
    NSArray *keys=[self allKeys];
    for(id key in keys)
    {//           
        id value=[self objectForKey:key];
        id copyValue;
        if ([value respondsToSelector:@selector(mutableDeepCopy)]) {
            //  key         mutableDeepCopy  (  NSDictionary),  mutableDeepCopy    
            copyValue=[value mutableDeepCopy];
        }else if([value respondsToSelector:@selector(mutableCopy)])
        {
            copyValue=[value mutableCopy];
        }
        if(copyValue==nil)
            copyValue=[value copy];
        [dict setObject:copyValue forKey:key];
 
    }
    return dict;
}
@end

테스트:
#import <Foundation/Foundation.h>
#import "NSDictionary+MutableDeepCopy.h"
//     
int main (int argc, const char * argv[])
{
 
    @autoreleasepool {
        NSMutableArray *arr1=[[NSMutableArray alloc] initWithObjects:@"aa",@"bb",@"cc", nil];
        NSDictionary *dict1=[[NSDictionary alloc] initWithObjectsAndKeys:arr1,@"arr1", nil];
        NSLog(@"%@",dict1);
        NSMutableDictionary *dict2=[dict1 mutableCopy];
        //   
        NSMutableDictionary *dict3=[dict1 mutableDeepCopy];
        //   
        [arr1 addObject:@"dd"];
        NSLog(@"%@",dict2);
        NSLog(@"%@",dict3);
 
    }
    return 0;
}

좋은 웹페이지 즐겨찾기