Xcode의 버전이 올라가면서, Xcode 4.2 이후로 새로운 메모리 관리 방식인 ARC (Automatic Reference Count) 로 인해 바뀐것이 있습니다.


Objective-C가 제공하는 3가지 메모리 관리 방식


MRR(Manual retain-release)

개발자에 의해서 의도적으로 관리되는 방식. 참조 수 계산 방식으로 관리 된다.


ARC(Automatic Reference Count)

MRR과 같은 참조 수 계산 방식을 사용하지만 컴파일 시 적절한 메모리 관리 함수 호출문을 넣어 처리한다.

-> 위에서 말한 ARC 가 이것이다.


Garbage Collection (가비지 컬렉션)
더이상 참조되지 않는 객체를 자동으로 제거하는 방식으로 MMR,  ARC와는 많이 다른 메카니즘을 제공한다. MAC OS X에서만 쓸 수 있다.


먼저, NSAutoreleasePool, @autoreleasepool 에 대한 설명.


NSAutoreleasePool

Cocoa의 메모리 참조 수 계산 방식(Reference-counted Memory Management System)을 지원하는 클래스
Automatic Reference Counting(ARC)를 사용하면 autorelease pools를 직접 사용할 수 없기 때문에 @autoreleasepool 블럭을 사용한다. 


@autoreleasepool

메모리 참조 수 계산 방식(Reference-counted Memory Management System)에서 쓰는 선언이다. (Garbage Collection과 대조된다)


첫번째로 Xcode에서 새로운 프로젝트를 생성할 때 MAC OS X - Application - Command Line Tool 을 이용, 그 후 main.m 을 보자. 


//구 버전 Xcode에서 사용했던 코드 (ARC 미적용)

#import <Foundation/Foundation.h>


int main (int argc, const char * argv[])

{

        NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init];

        

        // insert code here...

        NSLog(@"Hello, World!");

        [pool drain]; (또는 [pool release];)

    }

    return 0;

}


// apple : If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use @autoreleasepool blocks instead.

// 위 코드 대신 아래의 코드같이 사용해야 한다. 하지만 위의 코드도 잘 컴파일되고 동작한다.


#import <Foundation/Foundation.h>


int main (int argc, const char * argv[])

{

    @autoreleasepool {

        // insert code here...

        NSLog(@"Hello, World!");

    }

    

    return 0;

}


결론적으로 밑처럼 간단히 볼 수도 있겠다.


NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init]; -> @autoreleasepool {


[pool drain] (혹은 [pool release];) ->


하지만,  Non-ARC 에서는 autorelease pool 에 등록되었다가 pool 이 없어지면서 해제되고,  ARC 에서는  __autoreleasing pointer 가 아니므로 strong pointer lifecycle 에 의해 해제된다.



+ Recent posts