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;
}
결론적으로 밑처럼 간단히 볼 수도 있겠다.
하지만, Non-ARC 에서는 autorelease pool 에 등록되었다가 pool 이 없어지면서 해제되고, ARC 에서는 __autoreleasing pointer 가 아니므로 strong pointer lifecycle 에 의해 해제된다.
[출처] NSAutoreleasePool, @autoreleasepool|작성자 웃어임마