4장. 메모리관리 – 메모리관리 종류 – ARC



4장. 메모리관리 – 메모리관리 종류 – ARC

0 0


osxdev-ch4

메모리관리 발표

On Github rainbowstain / osxdev-ch4

4장. 메모리관리

http://rainbowstain.github.com/osxdev-ch4

메모리관리 종류

MRR (Manual Retain-Release) GC (Xcode 4.4 부터 가려진관계로 패스) ARC (Automatic Reference Counting)

MRR

Basic Memory Management Rule

"당신 / あなた / You" (Obj-C 객체)네가 창조한것은 너의 것이니라. 타인의 메모리는 retain/copy으로 취하라. 싫증나거든  release/autorelease 버릴지니, 타인의 메모리를 함부로 버리면 큰 화가 미칠것이야!!

MRR

new, alloc, copy, mutableCopy, retain 했다면 → release, autorelease 다른 방법으로 객체를 얻었다면 → retain/ copy 해서 보관 (release, autolease 잊지말것)
Methods Retain Counts new / alloc / copy / mutableCopy / retain +1 allocWithZone / copyWithZone / mutableCopyWithZone This method exists for historical reasons; memory zones are no longer used by Objective-C. +1 release / autorelease -1

MRR

소소한 삶의지혜 pt.1

Locality Rule 다음 두 분은 Threadsafe하시다.
  • retain
  • release
retainCount, dealloc을 직접 호출하지 말자. retainCycle 조심!
  • 멤버 객체 -> retain
  • 참조 객체 -> assign

MRR

소소한 삶의지혜 pt.2

사용하면 RETAIN되는것들
  • Container (e.g.) NSSet, NSArray, NSMapTable...
사용해도 RETAIN되지 않는것들
  • KVO addObserver:
  • NSNotificationCenter addObserver:
  • setTarget:

ARC

ARC 발명

  • Chris LattnerLLVM -> Apple
  • Object-C용 코드분석 툴 Clang이 release, retain 에러 체크가능!
  • Static Analyzer가 메모리 에러를 파악 할 수 있다면... 컴파일러가 메모리를 관리할 수 있겠네?!

ARC

  • 컴파일할때(!) 자동으로 retain, release를 처리.
  • 최종적으로 내부메모리 함수들을 사용해서 최적화
  • 적용대상
  • Object-C
  • Blocks ^{}
  • dispatch_object_t (10.8/6.0)

ARC

새로운 속성

property
  • @property(strong) *
  • @property(weak)
변수
  • __strong *
  • __weak
  • __unsafe_unretained
  • __autoreleasing

ARC

게임의 규칙

retain/ release/ retainCount/ autorelease 사용불가 [super dealloc] 불가 NSAutoreleasePool -> @autoreleasepool{} 블럭 id <-> void* 변환은 __bridge
  • (__bridge id)CFObjectType
  • (__bridge void*)anObject
자세한 사항은 ARC로 이사가기참조

ARC

두가지 팁

  • @property
    • int/float/char... -> assign
    • 멤버 객체 -> strong
    • 참조 객체 -> weak
    • block -> copy
  • CG-, void*, char* 는 __autoreleasing 으로 예뻐해주자
    UIColor *redColor = [UIColor redColor]; 
    CGColorRef redRef = redColor.CGColor;
    //여기서부터 redColor는 행불 
    UIColor * __autoreleasing redColor = [UIColor redColor];
    CGColorRef redRef = redColor.CGColor;
    //redColor는 autoreleasepool로 사랑받으사 좀더 머물러계심
    참조 : ARC Gotcha – Unexpectedly Short Lifetimes

ARC

참조문서

AutoreleasePool

두가지 팁

Multi-threading
  • Thread별로 autoreleasepool설정
  • Container Literal (@[], @{}) 사용에 유의
  • Runloop에 가짜로라도 꼭 이벤트를 넣어줘용~
이중-메모리풀로 메모리정리를 그때그때.
@autoreleasepool{
  @autoreleasepool{
    [obj autorelease]; (MRR)
    id __autoreleasing objc = [obj ...]; (ARC)
  }
}

NSBlocks ^{}

블럭사용시 메모리관리 (MRR)

타입 __const __block int,float,struct...(포인터 포함) 복사 복사 Object-C retain 참조 CFObject 참조 참조 dispatch_object_t 참조 참조 NSBlocks ^{}*복제시 복사 참조

NSBlocks ^{}

블럭사용시 메모리관리 (ARC)

타입 __const __block int,float,struct...(포인터 포함) 복사 복사 Object-C retain retain CFObject 참조 참조 dispatch_object_t 참조 참조 dispatch_object_t (10.8/iOS 6.0) retain retain NSBlocks ^{}*복제시 복사 참조

CoreFoundation

메모리관리

Create-,Copy-, CFRetain : retain +1 CFRelease : retain -1

NSObject와 섞어찌개를 끓일때(MRR)

id @property () __attribute__((NSObject))