疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:
person方法中覆写的dealloc方法和打印结果
2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?
3、使用类名方法创建对象,引用计数为2
阿神2017-04-24 09:14:06
특이한 멜론씨앗의 정답이 맞습니다.
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가지 "황금 규칙"만 따르면 됩니다.
PHP中文网2017-04-24 09:14:06
첫 번째 질문에 답하세요
출력 중에 객체의 메모리가 회수되었습니다.
재활용된 객체에 retainCount
메시지를 보낼 때 출력 결과가 불확실해야 합니다. 객체가 차지하는 메모리를 재사용하면 프로그램이 비정상적으로 종료될 수 있습니다.
이 불확실한 값이 0이 아닌 1인 이유는 무엇입니까? 왜냐하면 release
이 마지막으로 실행될 때 시스템은 메모리가 재활용되리라는 것을 알기 때문에 retainCount
를 1씩 감소시킬 필요가 없기 때문입니다. 객체는 감소 여부와 상관없이 반드시 재활용될 것이기 때문입니다. 1이든 아니든.
이 값을 1에서 0으로 변경하지 않으면 메모리 작업이 하나 줄어들고 개체 재활용 속도가 빨라질 수 있습니다.
결론: 해제된 개체에 메시지를 보내지 마십시오.