iOS 메모리 관리

  • Retain Count
    - 객체의 참조수를 관리하여 alloc시 참조수 1 증가, 0이 되면 객체 메모리 해제
    - retain, release 메시지 사용

  • Mac OS X 10.5 : Garbage collector
    - 프로그램 실행 중 동적으로 감시하고, 해당 영역에 있는 변수에서 접근 할 수 없는 객체 찾고 자동으로 메모리 해제
    - 실행 타임에서 메모리 관리
    - 문제점: 쓰레기 객체 탐색을 위해 CPU 소비 필요

  • Mac OS 10.7 : ARC
    - 코드를 컴파일 할 때 참조수를 컴파일러가 증가, 감소 관리

Strong Reference Cycle

    • 인스턴스가 서로 강한(strong) 참조 하여 메모리에서 사라지지 않는 경우
    • ARC Reference Cycle 자동적으로 대응 불가
    • ‘weak’ 이용하여 방지
    • custom delegate weak attribute 하는 이유

Retain Count

  • 참조 종류
    - Strong Reference:  객체가 다른 객체를 retain 하는 것. 기본 설정
    - Weak Reference
    : retain하지 않는 것. 단순 포인터 대입 (참조 순환 피하기 위해)
    : Zeroing Weak Reference: ARC에서 약한 참조의 객체가 메모리 해제할 때 nil로 설정하여 메모리 crush 예방
  • dealloc
    - 참조 수가 1인 객체에 release 보내면 호출됨
    - 마지막에 [super dealloc];
  • NSAutoreleasePool
    - 객체에 autorelease 메시지 -> Autorelase pool에 객체 추가 (가비지 컬렉터를 사용하지 않을 때)
    - Cocoa application: 모든 이벤트를 제어하기 전에 생성, 제어 후 해제
    - 오토릴리즈 객체를 리턴하는 클래스 메서드들이 있음. 
       ex) [NSString stringWithFormat: ….]
    - Release 시점: 보통 현재 이벤트 루프가 끝날 때
  • Retain
    - alloc, new, copy가 포함된 이름을 가진 메서드 (copy, mutableCopy ...)
      => 참조수 + 1 (atorelease pool x)
    - release 해야할 의무가 있음
  • Release
    - 소유를 원하지 않을 경우 release or autorelease
    - 0일 때 dealloc
  • 접근자 메서드
    - 다른 객체들이 인스턴스 변수를 접근하기 위해 사용
    - getter, setter
- (void)setFoo:(NSDate *) x {
    [x retain];
    [foo release];
    foo = x;
}

- (NSDate *)foo {
    return foo;
}

 

 

Swift version Strong reference cycle 볼 필요 있음

https://rhammer.tistory.com/139

+ Recent posts