NSMutableArray 객체에 copy을 호출하면 NSArray 객체가 반환되므로 [array4 release]이 호출되면 array4의 dealloc 메소드가 호출되어 NSArray dealloc이 출력됩니다.
그러면 autoreleasepool이 소멸되고 array3이 해제되며 array3의 dealloc 메소드가 호출되므로 NSMutableArray의 dealloc 메소드에서 [super dealloc]이 호출되므로 다음 두 문장이 출력됩니다.
StackOverflow에 대한 답변에 따르면 NSArray는 불변 객체이고 [NSArray array] 또는 [[NSArray alloc] init]에 의해 생성된 것은 불변 빈 배열이므로 Apple은 기본적으로 모든 불변 빈 배열을 사용하기 때문입니다. 최적화를 위해 고유한 인스턴스에 할당되므로 [NSArray array] 이전에 이 인스턴스의 keepCount는 1입니다. 코드에서 [NSArray array] 또는 [[NSArray alloc] init]는 이 빈 배열 인스턴스의 참조 횟수를 증가시킵니다.
다음 코드는 이를 보다 직관적으로 반영할 수 있습니다. a과 관련이 없는 [NSArray array] 문은 a의 참조 횟수를 증가시킵니다.
으아악
ARC가 켜져 있지 않으면 메모리 관리는 Apple 문서의 기본 메모리 관리 규칙에 있는 4가지 "황금 규칙"만 따르면 됩니다.
첫 번째 질문에 답하세요
출력 중에 객체의 메모리가 회수되었습니다.
재활용된 객체에 retainCount 메시지를 보낼 때 출력 결과가 불확실해야 합니다. 객체가 차지하는 메모리를 재사용하면 프로그램이 비정상적으로 종료될 수 있습니다.
이 불확실한 값이 0이 아닌 1인 이유는 무엇입니까? 왜냐하면 release이 마지막으로 실행될 때 시스템은 메모리가 재활용되리라는 것을 알기 때문에 retainCount를 1씩 감소시킬 필요가 없기 때문입니다. 객체는 감소 여부와 상관없이 반드시 재활용될 것이기 때문입니다. 1이든 아니든.
이 값을 1에서 0으로 변경하지 않으면 메모리 작업이 하나 줄어들고 개체 재활용 속도가 빨라질 수 있습니다.
결론: 해제된 개체에 메시지를 보내지 마십시오.
특이한 멜론씨앗의 정답이 맞습니다.
NSMutableArray
객체에copy
을 호출하면 NSArray 객체가 반환되므로[array4 release]
이 호출되면 array4의 dealloc 메소드가 호출되어NSArray dealloc
이 출력됩니다.그러면 autoreleasepool이 소멸되고 array3이 해제되며 array3의 dealloc 메소드가 호출되므로 NSMutableArray의 dealloc 메소드에서
[super dealloc]
이 호출되므로 다음 두 문장이 출력됩니다.StackOverflow에 대한 답변에 따르면 NSArray는 불변 객체이고
[NSArray array]
또는[[NSArray alloc] init]
에 의해 생성된 것은 불변 빈 배열이므로 Apple은 기본적으로 모든 불변 빈 배열을 사용하기 때문입니다. 최적화를 위해 고유한 인스턴스에 할당되므로[NSArray array]
이전에 이 인스턴스의 keepCount는 1입니다. 코드에서[NSArray array]
또는[[NSArray alloc] init]
는 이 빈 배열 인스턴스의 참조 횟수를 증가시킵니다.다음 코드는 이를 보다 직관적으로 반영할 수 있습니다.
으아악a
과 관련이 없는[NSArray array]
문은a
의 참조 횟수를 증가시킵니다.ARC가 켜져 있지 않으면 메모리 관리는 Apple 문서의 기본 메모리 관리 규칙에 있는 4가지 "황금 규칙"만 따르면 됩니다.
첫 번째 질문에 답하세요
출력 중에 객체의 메모리가 회수되었습니다.
재활용된 객체에
retainCount
메시지를 보낼 때 출력 결과가 불확실해야 합니다. 객체가 차지하는 메모리를 재사용하면 프로그램이 비정상적으로 종료될 수 있습니다.이 불확실한 값이 0이 아닌 1인 이유는 무엇입니까? 왜냐하면
release
이 마지막으로 실행될 때 시스템은 메모리가 재활용되리라는 것을 알기 때문에retainCount
를 1씩 감소시킬 필요가 없기 때문입니다. 객체는 감소 여부와 상관없이 반드시 재활용될 것이기 때문입니다. 1이든 아니든.이 값을 1에서 0으로 변경하지 않으면 메모리 작업이 하나 줄어들고 개체 재활용 속도가 빨라질 수 있습니다.
결론: 해제된 개체에 메시지를 보내지 마십시오.