2013년 4월 27일 토요일

iOS 프로그래밍 팁 - Objective - C 메모리 관리

ARC  옵션을 끄고 프로그래밍을 했고
수동으로 메모리 관리를 했는데
그래도 알고 넘어 가자

Objective-C  의 수동 메모리 관리 관련 메서드


retainCount : 객체 혹은 인스턴스의 변수가 특정 메모리 공간을 참조 하고 있는가를 나타내는 정수

alloc :  생성된 객체에 메모리 공간을 할장한다.

retain : 객체가 메모리 공간을 참조 하고 있다는 사실을 iOS에 알린다. reationCount를 1증가 시킨다.

release : retainCount 1감소 시킨다.

dealloc : 메모리 공간을 참조하고 있는 모든 객체가 더는 해당 메모리 공간을 사용하지 말라는 명령을 내린다. retainCount = 0


retainCount 값이 1또는 그이상이면 iOS는 메모리 공간을 소유하고 사용할수 있다.
retainCount 값이 0이 될경우 공간에 대한 소유권을 반환받아 할당되었던 메모리 공간을 회수 한다.



약한 참조 (weak reference)
Foo * myFooOne = [[Foo alloc[ initWithName:@"James"];
Foo * myFooTwo = myFooOne       //<--- 약한 참조
[myFooOne release];
//myFooTwo  사용시 런타임 에러 발생



Foo * myFooOne = [[Foo alloc[ initWithName:@"James"];
Foo * myFooTwo = myFooOne       //<--- 약한 참조
[myFooTwo retain]; //<-- 해주어야
[myFooOne release];

//myFooTwo 이용가능


자동 메모리 관리 ARC


ARC는 Automatic Reference Counting의 약자로 기존에 수동(MRC라고 함)으로 개발자가 직접 retain/release를 통해 reference counting을 관리해야 하는 부분을 자동으로 해준다.

1. retain/release/autorelease 키워드 사용금지
2. C 구조체 내에 Object 타입 사용 금지
3. Core Foundation은 Objective-C의 Object 타입이 아니므로 Core Foundation 과 Object 간의 명시적인 타입 캐스팅이 필요 하다.


프로퍼티 속성
strong --> retain 과 거의 같다.

weak 는 assign 키워드 처럼 retainCount를 증가 시키지 않는다.
assign과는 다르게 참조하는 객체가 해제(deallocated)되면 weak로 선언된 프로퍼티는 자동으로 nil이 대입된다

ARC가 없던시절
reain --> strong
assing --> weak 
라고 이해 하면
weak가 assign과 차이점이라면
음 assign은 int float 등등 primitive타입에 사용하는 것이고 weak는 객체에 사용한다고 생각하면 
될듯 하다.

그래도 역시 ARC보단 ARC off가 편할듯 하다.


댓글 없음: