깊이 및 얕은 복사 정보
4605 단어 복제하다
딥 카피(딥 카피, 컨텐츠 카피, deep copy)
소스 객체와 복제본 객체는 서로 다른 두 객체입니다.
원본 대상 인용 계수기는 변하지 않고, 던전 대상 계수기는 1입니다. (새로 생겼기 때문입니다.)
본질은 새로운 대상이 생겼다는 것이다
얕은 복사(얕은 복사, 포인터 복사, shallow copy)
소스 객체와 복제본 객체가 동일합니다.
원본 대상 (던전 대상) 인용 계수기 + 1,retain 동작을 한 번 하는 것과 같다
본질은 새로운 대상이 생기지 않았다는 것이다
한마디로 깊은 복제는 새로운 대상을 만들었고, 얕은 복제는 새로운 대상을 만들지 않았으며, 원래 대상이retain 조작을 한 번 하였다.
2. NSString과 NSMutableString을 예로 들면 copy와mutableCopy 요약
//string copy
NSString *str1 = [NSString stringWithFormat:@"addd"];
NSMutableString *str2 = [str1 copy];
//str1 = 0x7f9cc9c0ef20,count = 2
//str2 = 0x7f9cc9c0ef20, coutn =2
//string mutablecopy
NSString *str1 = [NSString stringWithFormat:@"addd"];
NSMutableString *str2 = [str1 mutableCopy];
//str1 = 0x7f8583e1c560,count = 1
//str2 = 0x7f8583e1c400, coutn =1
//mutableString copy
NSMutableString *str1 = [NSMutableString stringWithFormat:@"addd"];
NSMutableString *str2 = [str1 copy];
//str1 = 0x7fbce2f21560,count = 1
//str2 = 0x7fbce2f1ee40, coutn =1
//mutableString mutablecopy
NSString *str1 = [NSString stringWithFormat:@"addd"];
NSMutableString *str2 = [str1 mutableCopy];
//str1 = 0x7fea5a555d80,count = 1
//str2 = 0x7fea5a538020, coutn =1
NSLog(@"str1 = %p,count = %lu",str1,str1.retainCount);
NSLog(@"str2 = %p, coutn =%lu ",str2,str2.retainCount);
위 코드에서 알 수 있듯이
1. NSString이 코피를 호출하여 다른 대상(NSString이든 NSMutableString이든)에게 복제하는 것만이 얕은 복제이고 다른 상황은 깊은 복제이다.
2. copy: 변경되지 않는 복사본을 만듭니다(중요).
mutableCopy: 가변 복사본 생성
3. 분석: 코피 작성 대상의 불변성으로 인해 코피를 호출한 대상이 NSString 유형이라면 원 대상과 복사본(신규) 대상은 변할 수 없습니다.
메모리 이용률에서 볼 때 그들 둘은 같은 메모리 공간을 가리키는 것이 비교적 합리적이다. 즉, 신구 두 바늘 변수는 모두 원래의 대상(메모리)을 가리킨다.
이 대상(메모리)의 계수기는 1만 더하면 모두 기뻐한다. 이것이 바로 얕은 복제이다.
한마디: 원본 대상과 던전 대상이 모두 변할 수 없을 때만 얕은 복제이고 다른 것은 모두 깊은 복제이다
마지막으로 @prpoerty 속성에서 NSString이 retain 대신 copy를 사용하는 이유를 설명합니다.
copy와retain의 관건 set 방법은 모두가 알고 있어야 한다. 모두는release의 옛 값, 그리고copy나retain의 새 값,
retain 새 값은 전송된 새 값 계수기를 1로 추가한 다음에 대상을 속성에 복치하는 것이다. 두 사람 모두 같은 대상을 가리키는 것이 분명하다.
바깥의 대상이 변하면 내부의 속성도 반드시 따라서 변한다. 이것은 일반적인 대상에게는 괜찮지만 NSString의 대상에게는 믿을 수 없다. 내가 들어온 대상을 가지고 있어도 소용없다. 바깥의 NSString은 변하고 내 안의 NSString 유형의 속성도 따라서 변한다. 그러면 문제가 생긴다. 바깥의 NSString은 변할 수 있지만 입을 때 무엇이 있으면 바깥을 따라 변할 수 없다.
이것은 코피의 코피를 사용한 후에 새로운 대상이 변하지 않는 특성을 필요로 한다.네가 변할 수 있든 없든 NSString이 들어오면 내 set 방법에서 copy가 나오면 속성은 판에 정해진 대로 변하지 않는다
바로 이 코피의 새로운 값이 사람을 곤혹스럽게 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 및 얕은 복사 정보원본 대상 인용 계수기는 변하지 않고, 던전 대상 계수기는 1입니다. 본질은 새로운 대상이 생겼다는 것이다 원본 대상 (던전 대상) 인용 계수기 + 1,retain 동작을 한 번 하는 것과 같다 본질은 새로운 대상이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.