objective-c - NSArray *array = otherarray;是深拷贝还是浅拷贝?该怎么理解
PHPz
PHPz 2017-04-24 09:11:20
0
2
516

NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = array;
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是 1,1


NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array copy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是 2,2


NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array mutbaleCopy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);

结果是1,1

所以应该怎么理解???

PHPz
PHPz

学习是最好的投资!

모든 응답(2)
PHPzhong

으아악

위 코드는 깊은 복사본도 아니고 얕은 복사본도 아닙니다. 이는 단지 포인터 할당일 뿐이며 동일한 메모리를 가리킵니다.


으아악

위 코드는 이론적으로 얕은 복사본 array을 생성하지만 실제로는 복사가 발생하지 않고 retain 하나만 수행됩니다.

이것은 NSArray이 수정될 수 없는 읽기 전용 배열이기 때문입니다. NSCopying 프로토콜을 구현할 때 새 객체를 생성하지 않고 영리하게 retain를 한 번만 수행했기 때문에 참조 횟수는 다음과 같습니다. arrayarr2 둘 다 2가 되는데, 이는 다소 직관에 어긋납니다.

이때 arrayarr2은 같은 메모리를 가리키고 있는데 이는 포인터 주소를 출력해 보면 알 수 있다.


으아악

위 코드에서 mutableCopyNSMutableArray을 반환합니다. 이때 NSArray는 단지 새로운 NSMutableArray 객체를 생성하고 arrayNSArray을 가리킵니다. 🎜>은 새로 생성된 arr2을 가리키므로 참조 횟수는 모두 1입니다. NSMutableArray


깊은 복사와 얕은 복사로 돌아가서, 컨테이너의 객체가 복사 중에 참조 횟수만 증가한다면 이는 얕은 복사입니다. 그렇지 않으면 각 객체에 대해 새 객체가 생성됩니다. 깊은 복사본입니다.

질문자는 명확하고 정확한 결과를 얻으려면

을 사용해 보아야 합니다. NSMutableArray 이런 종류의 불변 컨테이너는 원하는 효과를 볼 수 없습니다. NSArray

그런데

NSMutableArray은 얕은 카피입니다. copy

洪涛

여담으로, 중단점, LLDB 디버깅 또는 메모리 주소 인쇄 및 관찰은 여기서 메커니즘을 더 잘 이해하는 데 도움이 될 수 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿