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
으아악
위 코드는 깊은 복사본도 아니고 얕은 복사본도 아닙니다. 이는 단지 포인터 할당일 뿐이며 동일한 메모리를 가리킵니다.
으아악
위 코드는 이론적으로 얕은 복사본
array
을 생성하지만 실제로는 복사가 발생하지 않고retain
하나만 수행됩니다.이것은
NSArray
이 수정될 수 없는 읽기 전용 배열이기 때문입니다.NSCopying
프로토콜을 구현할 때 새 객체를 생성하지 않고 영리하게retain
를 한 번만 수행했기 때문에 참조 횟수는 다음과 같습니다.array
과arr2
둘 다 2가 되는데, 이는 다소 직관에 어긋납니다.이때
array
과arr2
은 같은 메모리를 가리키고 있는데 이는 포인터 주소를 출력해 보면 알 수 있다.으아악
위 코드에서
mutableCopy
은NSMutableArray
을 반환합니다. 이때NSArray
는 단지 새로운NSMutableArray
객체를 생성하고array
는NSArray
을 가리킵니다. 🎜>은 새로 생성된arr2
을 가리키므로 참조 횟수는 모두 1입니다.NSMutableArray
깊은 복사와 얕은 복사로 돌아가서, 컨테이너의 객체가 복사 중에 참조 횟수만 증가한다면 이는 얕은 복사입니다. 그렇지 않으면 각 객체에 대해 새 객체가 생성됩니다. 깊은 복사본입니다.
을 사용해 보아야 합니다.
그런데NSMutableArray
이런 종류의 불변 컨테이너는 원하는 효과를 볼 수 없습니다.NSArray
의
NSMutableArray
은 얕은 카피입니다.copy
여담으로, 중단점, LLDB 디버깅 또는 메모리 주소 인쇄 및 관찰은 여기서 메커니즘을 더 잘 이해하는 데 도움이 될 수 있습니다.