의심:
1. 메모리 관리: dealloc 후, keepCount = 를 출력할 수도 있습니다. 1
기본 메소드:

재정의된 dealloc 메소드 및 person 메소드의 결과 인쇄

2. 두 범주 모두 검증 출력을 위해 dealloc 메서드만 재정의합니다.
Copy로 생성된 객체가 해제된 후 dealloc 메소드가 호출되는데, 자동 해제 풀에 의해 객체가 해제되면 다시 해제됩니다
왜 두 번 출시되나요?

3. 클래스 이름 방법을 사용하여 참조 횟수가 2인 객체를 만듭니다

특이한 멜론씨앗의 정답이 맞습니다.
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으로 변경하지 않으면 메모리 작업이 하나 줄어들고 개체 재활용 속도가 빨라질 수 있습니다.
결론: 해제된 개체에 메시지를 보내지 마십시오.