심도 복제 -ios

3035 단어
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"];//이렇게 하면 상기 세 개의 수조의 첫 번째 요소가 모두 바뀌었다는 것을 알 수 있다. 용기에 있어 그 원소의 대상은 시종 바늘로 복제된다.원소 대상도 대상 복제가 필요하다면 깊이 복제가 필요하다.

좋은 웹페이지 즐겨찾기