얕은 복사와 깊은 복사의 차이

4684 단어

전언

  • iOS에서 모든 대상이copy와mutableCopy를 지원하는 것은 아니다.두 가지 협의를 준수해야 한다.이 두 프로토콜의 클래스를 준수해야만 copy와mutable Copy 메시지를 보낼 수 있습니다. 제가 직접 테스트를 했습니다. 만약에 제가 프로토콜을 준수하지 않았다면copy WithZone과mutable Copy WithZone은 알림이 없습니다. 만약에 우리가 이 두 가지 방법을 강제로 실행한다면 프로그램은 바로 붕괴될 것입니다.코피와mutableCopy 대상 방법을 직접 호출하면 실행도 붕괴됩니다. 이 두 프로토콜을 준수해야 한다는 것을 알려 줍니다.
  • 간단한 복사
  • 이른바 얕은 복사란 대상을 가리키는 바늘을 복사하는 것이다. 복사된 목표 대상의 바늘과 원본 대상의 바늘이 가리키는 메모리 공간은 같은 공간이라는 뜻이다.
  • 얕은 복사본은 간단한 복사본으로 몇 개의 대상이 하나의 메모리를 공용하도록 한다. 그러나 메모리를 소각할 때 이 메모리 공간을 가리키는 모든 바늘을 다시 정의해야 한다. 그렇지 않으면 야생 바늘 오류가 발생할 수 있다
  • 딥 카피
  • 이른바 딥 카피란 카피 대상의 구체적인 내용을 가리키는데 그 내용 주소는 셀프 분배된 것이다. 카피가 끝난 후에 메모리의 값은 완전히 같지만 메모리 주소는 다르고 두 대상 간에 서로 영향을 주지 않고 간섭하지 않는다.

  • 현재 A 객체가 있다면 복사한 후에 새로운 객체 A 를 얻을 수 있는 양자 간의 원리를 정리해 봅시다.Copy, 짧은 복제본의 경우 A 객체 및 ACopy 대상은 같은 메모리의 자원을 가리키며, 대상의 내용은 복사되지 않았습니다.대상의 자원이 하나밖에 없다는 얘기지.만약 이때 우리가 A 에게copy 대상이 수정 작업을 진행하면 A 대상의 내용도 수정됩니다.그러나 심층 복사라면 바늘뿐만 아니라 내용, 복사된 대상 BCopy는 메모리를 셀프 할당합니다. 두 객체의 포인터는 서로 다른 메모리 공간을 가리킵니다. 왜냐하면 A 객체와 BCopy 객체의 메모리 주소가 다르므로 BCopy에서 수정 작업을 수행하면 A객체에 영향을 주지 않으며 서로 간섭하지 않습니다
  • .
  • 얕은 카피는 당신과 당신의 그림자 사이의 관계라고 생각합니다: 당신이 끊으면 당신의 그림자도 따라서 끊깁니다
  • 딥 카피는 당신의 복제자 같아요. 끊으세요. 그런데 당신의 복제자가 살아있어요
  • 얕은 복사와 깊은 복사의 응용
  • oc에서 얕은 복사가 가능한 작업:
  • 제1조:retain 조작, 시종 얕은 복제.객체의 가변 여부를 복사된 객체와 일치시킬지 여부를 반환합니다.
  • iOS에서 Retain 키워드를 사용하여 인용 계수를 하는 것은 더욱 안전한 얕은 복사이다.그는 몇 개의 바늘로 하여금 같은 메모리 공간을 공용하게 할 뿐만 아니라,release는 계수의 존재로 인해 쉽게 메모리를 소각하지 않고 더욱 간단하게 사용하는 목적을 달성할 수 있다.

  • 제2조:copy작업은 변할 수 없는 대상에 대해 얕은 복제이다.인용 계수는 매번 1을 더한다.불변 객체가 항상 반환됩니다.
  • oc에서 어떤 조작이 심층 복사를 실현했는지:
  • 제1조:copy조작, 가변 대상이 심복제인 경우 인용계수는 변하지 않습니다.
  • 제2조:mutableCopy 작업: 시종 깊이 복제이며 인용 계수는 변하지 않습니다.항상 가변 객체가 반환됩니다.

  • 코드 예
        NSString *text = @"WilliamAlex";
    
        NSString *text1 = [text copy];
        NSString *text2 = [text mutableCopy];
        NSMutableString *text3 = [text copy];
        NSMutableString *text4 = [text mutableCopy];
    
        NSLog(@"text=%p,text1=%p",text,text1);
        NSLog(@"text=%p,text1=%p",text,text2);
        NSLog(@"text=%p,text1=%p",text,text3);
        NSLog(@"text=%p,text1=%p",text,text4);
    

    인쇄 결과
     [716:38840] text=0x10697f068,text1=0x10697f068
     [716:38840] text=0x10697f068,text2=0x7fce33c74be0
     [716:38840] text=0x10697f068,text3=0x10697f068
     [716:38840] text=0x10697f068,text4=0x7fce33c783d0
    
  • 참고:
  • 두 프로토콜을 따라야 합니다. 그렇지 않으면 프로그램이 붕괴됩니다
  • 인쇄 결과에서 보듯이text1,text3의 주소는text와 같고text2와text3은text와 다르다.결론을 얻어낼 수 있다
  • 1, mutableCopy를 사용하여 새로운 대상을 복사한 것을 설명합니다. 그들의 주소가 다르고 새로운 대상을 생성한 것을 설명합니다
  • 2,copy를 사용했는데 그들의 주소는 똑같아서 복사한 것은 지침일 뿐 대상 자체를 복사하지 않는다는 것을 의미한다.새로운 이미지가 생기지 않는다는 거지.

  • 총괄: 문자열이 직접 값을 부여할 때 새로운 대상을 생성하는지 판단하는 것은 등호'='오른쪽과 직접적인 관계가 있고 오른쪽이mutableCopy라면 새로운 대상을 생성하고copy라면 새로운 대상을 생성하지 않는다.이때의copy는얕은카피,mutableCopy는심카피
  • stringWithFormat:메소드의 문자열
     NSString *text = [NSString stringWithFormat:@"WilliamAlex"];
    
        NSString *text1 = [text copy];
        NSString *text2 = [text mutableCopy];
        NSMutableString *text3 = [text copy];
        NSMutableString *text4 = [text mutableCopy];
    
        NSLog(@"text=%p,text1=%p",text,text1);
        NSLog(@"text=%p,text1=%p",text,text2);
        NSLog(@"text=%p,text1=%p",text,text3);
        NSLog(@"text=%p,text1=%p",text,text4);
    

    인쇄 결과
     [734:43455] text=0x7fbaca70c890,text1=0x7fbaca70c890
     [734:43455] text=0x7fbaca70c890,text1=0x7fbaca70d760
     [734:43455] text=0x7fbaca70c890,text1=0x7fbaca70c890
     [734:43455] text=0x7fbaca70c890,text1=0x7fbaca70d7a0
    
  • 결과는 직접 할당치와 완전히 같다
  • stringWithString:메소드의 문자열
    
        NSString *text = [NSMutableString stringWithString:@"WilliamAlex"];
    
        NSString *text1 = [text copy];
        NSString *text2 = [text mutableCopy];
        NSMutableString *text3 = [text copy];
        NSMutableString *text4 = [text mutableCopy];
    
        NSLog(@"text=%p,text1=%p",text,text1);
        NSLog(@"text=%p,text1=%p",text,text2);
        NSLog(@"text=%p,text1=%p",text,text3);
        NSLog(@"text=%p,text1=%p",text,text4);
    

    인쇄 결과
     [762:45587] text=0x7fbd495aaf20,text1=0x7fbd495aac50
     [762:45587] text=0x7fbd495aaf20,text1=0x7fbd495afad0
     [762:45587] text=0x7fbd495aaf20,text1=0x7fbd495af810
     [762:45587] text=0x7fbd495aaf20,text1=0x7fbd495acdf0
    
    
  • 결과가 모두 다르다
  • 요약: 코드에 따라 등호'='오른쪽은 창설에서 부치까지 NSMutable Copying을 포함하기 때문에 대상을 다시 생성한다.copy는 바늘 복사이고 mutable Copy는 대상 복사이다.
  • 좋은 웹페이지 즐겨찾기