三个关于objective-c内存管理的疑惑,希望能有人帮我解答
PHPz
PHPz 2017-04-24 09:12:06
0
2
339

疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:

person方法中覆写的dealloc方法和打印结果

2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?

3、使用类名方法创建对象,引用计数为2

PHPz
PHPz

学习是最好的投资!

모든 응답(2)
阿神
  1. 특이한 멜론씨앗의 정답이 맞습니다.

  2. NSMutableArray 객체에 copy을 호출하면 NSArray 객체가 반환되므로 [array4 release]이 호출되면 array4의 dealloc 메소드가 호출되어 NSArray dealloc이 출력됩니다.
    그러면 autoreleasepool이 소멸되고 array3이 해제되며 array3의 dealloc 메소드가 호출되므로 NSMutableArray의 dealloc 메소드에서 [super dealloc]이 호출되므로 다음 두 문장이 출력됩니다.

  3. StackOverflow에 대한 답변에 따르면 NSArray는 불변 객체이고 [NSArray array] 또는 [[NSArray alloc] init]에 의해 생성된 것은 불변 빈 배열이므로 Apple은 기본적으로 모든 불변 빈 배열을 사용하기 때문입니다. 최적화를 위해 고유한 인스턴스에 할당되므로 [NSArray array] 이전에 이 인스턴스의 keepCount는 1입니다. 코드에서 [NSArray array] 또는 [[NSArray alloc] init]는 이 빈 배열 인스턴스의 참조 횟수를 증가시킵니다.

다음 코드는 이를 보다 직관적으로 반영할 수 있습니다. a과 관련이 없는 [NSArray array] 문은 a의 참조 횟수를 증가시킵니다.

으아악

ARC가 켜져 있지 않으면 메모리 관리는 Apple 문서의 기본 메모리 관리 규칙에 있는 4가지 "황금 규칙"만 따르면 됩니다.

Ty80

첫 번째 질문에 답하세요
출력 중에 객체의 메모리가 회수되었습니다.
재활용된 객체에 retainCount 메시지를 보낼 때 출력 결과가 불확실해야 합니다. 객체가 차지하는 메모리를 재사용하면 프로그램이 비정상적으로 종료될 수 있습니다.
이 불확실한 값이 0이 아닌 1인 이유는 무엇입니까? 왜냐하면 release이 마지막으로 실행될 때 시스템은 메모리가 재활용되리라는 것을 알기 때문에 retainCount를 1씩 감소시킬 필요가 없기 때문입니다. 객체는 감소 여부와 상관없이 반드시 재활용될 것이기 때문입니다. 1이든 아니든.
이 값을 1에서 0으로 변경하지 않으면 메모리 작업이 하나 줄어들고 개체 재활용 속도가 빨라질 수 있습니다.
결론: 해제된 개체에 메시지를 보내지 마십시오.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!