심도 복제 -ios
제공
copy
및
mutablecopy
방법은 말 그대로
copy
그냥 복사한 거예요.
imutable
개체: 포인터 복사
mutablecopy
그냥 복사한 거예요.
mutable
의 객체: 객체가 복사됩니다.다음은 몇 가지 예를 들어 설명할 것이다
1: 시스템의 비컨테이너 클래스 객체
여기에는 NSString, NSNumber 등의 대상을 가리킨다NSString *string = @"origion";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];
메모리를 보면 string과stringCopy가 같은 메모리 영역을 가리키는 것을 알 수 있습니다. (apple 약인용weak reference 라고도 부릅니다.) 이때stringCopy의 인용 계수는string의 인용과 마찬가지로 모두 2입니다.한편stringMCopy는 우리가 말한 진정한 의미의 복제이다. 시스템은 그에게 새로운 메모리를 분배했지만 바늘이 가리키는 문자열은string이 가리키는 것과 같다.
다음 예를 참조하십시오.
NSMutableString *string = [NSMutableString stringWithString: @"origion"];
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
[mStringCopy appendString:@"mm"];//error
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];
네 개의 NSString 객체에 할당된 메모리는 모두 다릅니다.그러나 mStringCopy는 사실 imutable 대상이기 때문에 위에서 말한 것은 틀릴 수 있습니다.
시스템의 비용기류 대상에 대해 우리는 변할 수 없는 대상을 복제하면 코피는 바늘 복제(얕은 복사)와mutable Copy는 대상 복제(깊은 복사)라고 볼 수 있다.가변 대상을 복제하면 모두 깊이 복사하지만, 코피가 되돌아오는 대상은 가변적이지 않습니다.
2: 시스템의 컨테이너 클래스 객체
NSArray, NSDictionary 등을 나타냅니다.용기류 자체에 대해 위에서 논의한 결론도 적용되고 복제 후 용기 내 대상의 변화를 연구해야 한다
//copy ,mutablecopy
NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
NSArray *arrayCopy1 = [array1 copy];
//arrayCopy1 array NSArray ( ), array
NSLog(@"array1 retain count: %d",[array1 retainCount]);
NSLog(@"array1 retain count: %d",[arrayCopy1 retainCount]);
NSMutableArray *mArrayCopy1 = [array1 mutableCopy];
//mArrayCopy1 array1 , array1 , array1 。mArrayCopy1
[mArrayCopy1 addObject:@"de"];
[mArrayCopy1 removeObjectAtIndex:0];
array1과 arrayCopy1은 포인터 복제이고 mArrayCopy1은 대상 복제이며 mArrayCopy1은 기간 내의 요소를 삭제하거나 추가할 수 있습니다.그러나 컨테이너 내의 요소 컨텐트는 포인터로 복사됩니다.
다음은 또 다른 예로 테스트해 보겠습니다.
NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *mArrayCopy2 = [mArray1 copy];
NSLog(@"mArray1 retain count: %d",[mArray1 retainCount]);
NSMutableArray *mArrayMCopy1 = [mArray1 mutableCopy];
NSLog(@"mArray1 retain count: %d",[mArray1 retainCount]);
//mArrayCopy2, mArrayMCopy1과 mArray1이 가리키는 것은 모두 다른 대상이지만 그 중의 원소는 모두 같은 대상이다. 같은 지침//테스트NSMutableString*testString = [mArray1 objectAtIndex:0]; //testString = @"1a1";//이렇게 하면 테스트 스트링의 바늘을 바꿉니다. 사실 @ "1a1"임시 대상을 테스트 스트링에 부여합니다. [테스트 스트링 appendString: @ "tail"];//이렇게 하면 상기 세 개의 수조의 첫 번째 요소가 모두 바뀌었다는 것을 알 수 있다. 용기에 있어 그 원소의 대상은 시종 바늘로 복제된다.원소 대상도 대상 복제가 필요하다면 깊이 복제가 필요하다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.