iOS/Objective-C 개발 사전 NSDictionary 의 깊이 있는 복사 (category 사용)
3055 단어 Objective-CNSDictionary
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PreferenceBundle에서 오른쪽 상단에 Respring 버튼을 클릭합니다.만나서 반갑습니다, Minazuki라고합니다. 프로필 이름 : Minazuki_dev Twitter : Repo : 아직 중학생이므로 말이 이상한 곳이 있습니다만 용서해 주세요… 🙏 theos (Mac이든 단품이든 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.