copy와mutableCopy의 깊이, 얕은 복사

2531 단어 table
대상 복사는 주로 두 가지 방식으로 이루어집니다:copy와mutableCopy.얕은 복사란 바늘을 원래의 주소로 직접 가리키며 복제의 목적을 달성하는 것을 말한다.딥 카피는 객체를 재생성하여 기존 객체의 내용을 새 객체로 복사하는 것입니다.copy는 변할 수 없는 대상을 되돌려줍니다.mutable Cpoy는 변할 수 있는 대상을 되돌려줍니다. 그러나 OC의 약한 문법 특성 때문에 다음과 같이 컴파일러를 사용해도 틀리지 않습니다.그러나 다시 실행할 때arrayCopy는 구체적인 방법을 찾지 못하고 오류를 보고합니다.
NSMutableArray *arrayCopy=[muArray copy];
copy는 인용된 대상이 가변적일 때 깊이 복사하고, 가변적일 수 없는 대상일 경우 얕은 복사입니다.mutableCopy는 객체가 가변적이든 아니든 깊이 복사됩니다.
int main(int argc, const char * argv[])

{

    

    NSMutableArray *muArray=[[NSMutableArray alloc] init];

    

    // ClassA , 

    ClassA *a=[[ClassA alloc] init];

    [muArray addObject:a];

    

    NSMutableArray *arrayCopy=[muArray copy];// add object: , ( )

    NSMutableArray *arrayMutableCopy=[muArray mutableCopy];

    

    NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy);

    

    [a release];

    [muArray release];

    [arrayMutableCopy release];

    [arrayCopy release];

    return 0;

}

출력된 결과는요.
2015-01-23 12:06:58.342 Test[3375:303] 0x100100d40---0x1001023b0----0x100105020
주소가 모두 다르다는 것을 알 수 있다.
int main(int argc, const char * argv[])

{

    NSArray *array=@[@1,@2,@3];

    

    NSArray *arrayCopy=[array copy];

    NSMutableArray *arrayMutableCopy=[array mutableCopy];

    

    NSLog(@"%p---%p----%p----%ld",arrayCopy,array,arrayMutableCopy,[arrayCopy retainCount]);

    

    [arrayMutableCopy release];

    [arrayCopy release];

    return 0;

}

출력된 결과는요.
 
2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2
코피를 사용하여 나온 대상 주소가 원래 주소와 같다는 것을 알 수 있다. 즉, 사실은 같은 대상이다.인용계수기도 2다.
모든 컨테이너 클래스와 마찬가지로 NSArray에는 여전히 포인터가 들어 있습니다.대상 자체가 아니라, 사실 수조의 모든 요소는 대상의 주소이다.우리가 얕은 복사본을 사용할 때, 우리 대부분은 대상이 공유하는 문제에 주의할 수 있다.예:
int main(int argc, const char * argv[])

{



    NSMutableArray *muArray=[[NSMutableArray alloc] init];

    

        // ClassA , 

    ClassA *a=[[ClassA alloc] init];

    a.val=1;// , val 1

    [muArray addObject:a];

    

    NSArray *arrayCopy=[muArray copy];

    ClassA *b=arrayCopy[0];

    b.val=2;// , val 2

    

    NSLog(@"%ld",[muArray[0] val]);

    

    [a release];

    [muArray release];

    [arrayCopy release];

    return 0;

}


인쇄 결과는 다음과 같습니다.
2015-01-23 12:21:32.972 Test[3443:303] 2
깊이 복사해도 원래의 수조에 영향을 미쳤다.
 
저장된 주소가 모두 주소이기 때문에 깊이 복사할 때 모든 주소를 복사했지만 같은 대상을 가리켰다.

좋은 웹페이지 즐겨찾기