찾다

 >  Q&A  >  본문

Objective-c - xcode에서 arc가 활성화된 후 객체는 언제 해제됩니까?

방금 목표 c를 배웠는데 메모리 관리 문제가 발생했습니다. 상황은 다음과 같습니다.
arc가 활성화되고 Person 클래스가 설정되었으며 약한 속성(NSMutableArray *)favor가 하나만 있습니다

Person.h는 다음과 같습니다

으아아아

Person.m은 다음과 같습니다

으아아아

main.m은 다음과 같습니다

으아아아

콘솔에서 출력한 결과는 이렇습니다

으아아아

내 분석은: arr이 처음에 가리키는 객체는 그것을 가리키는 강한 포인터만 가지고 있다는 것입니다. p.favor = arr이지만 호의 속성은 약하므로 arr = nil일 때 이 객체는 강한 포인터를 갖지 않습니다. 이를 가리키는 포인터가 이때 객체가 해제되어야 하는데 두 번째 인쇄 결과
로 표시됩니다. 그런데 첫 번째 인쇄를 주석 처리하면

이 됩니다. 으아아아

인쇄 결과는

으아아아

개체가 해제되었음을 나타냅니다

제 질문은:

  1. arc가 활성화된 후 강한 포인터(강한 참조) 없이 객체가 즉시 해제됩니까? 아니라면 언제 출시되나요? (init로 시작하는 메소드를 사용하여 생성한 배열 객체는 arc가 아닌 상황에서는 자동 해제되지 않으며 주 함수에는 @autoreleasepool이 없습니다.)

  2. 도트 구문이 객체 릴리스에 영향을 미치나요? (이런 질문을 드리는 이유는 프로퍼티를 사용하지 않고 @public의 멤버 변수로 favorite을 설정했을 때 처음 p->_favor로 출력할 때 arr = nil이 되는 상황이 풀리지 않기 때문입니다. 나타나지 않습니다)

  3. arc는 객체를 해제할 시기를 어떻게 결정하나요? 나는 컴파일할 때 자동 릴리스를 유지하는 시기를 arc가 결정한다는 것을 알고 있는데 어떻게 결정합니까?

迷茫迷茫2843일 전446

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

  • 天蓬老师

    天蓬老师2017-04-24 16:02:24

    으아아아

    구체적인 질문은 이 글을 주의 깊게 읽어보세요
    http://clang.llvm.org/docs/AutomaticReferenceCounting.html
    이 글을 읽고 나면 메모리 관리에 대한 모든 것을 이해하게 될 것입니다

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-24 16:02:24

    메모리 공간을 가리키는 포인터가 없으면 자동으로 해제됩니다.

    으아아아

    arr은 강력한 참조이며 nil로 설정되었습니다. 당연히 p.favor는 해당 메모리 주소를 찾을 수 없으므로 (null)을 출력합니다.

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