>  Q&A  >  본문

三个关于objective-c内存管理的疑惑,希望能有人帮我解答

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

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

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

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

PHPzPHPz2734일 전343

모든 응답(2)나는 대답할 것이다

  • 阿神

    阿神2017-04-24 09:14:06

    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가지 "황금 규칙"만 따르면 됩니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-24 09:14:06

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

    회신하다
    0
  • 취소회신하다