반응형
[http://blog.appgate.in/18 에서 퍼온 글입니다]
어려우시면 간단하게 서적 참조해온 글 가장 하단 부분에 업데이트 했습니다.
iOS5의 ARC(Automatic Reference Counting)은 Objective-C 객체의 메모리 관리를 자동으로 관리하는 "Compiler" 속성이다. 이 속성을 사용하면 예전에 쓰던 retain, release, autorelease, dealloc 코드는 사용할 수 없게되며 이들이 하던 역할을 컴파일 시점에 알아서 처리해준다. ARC가 허용하지 않는 코드를 사용하면 아래와 같은 에러를 뿜어낸다.
그럼, ARC을 사용하게 되면 기존 오픈소스를 사용하는데 문제가 되지 않을까 걱정을 할 수 있는데 다음과 같이 해결하면 된다.
- 이미 컴파일된 오픈소스 라이브러리 사용
- ARC옵션을 끈 다른 라이브러리 프로젝트를 생성해서 사용
- 오픈소스 파일별로 ARC옵션을 끄고 사용
프로젝트 Build Settings에서 Objective-C Automatic Reference Counting을 NO로 바꾸거나
프로젝트 Build Phases에서 옵션을 끌 파일들을 선택한 후 엔터를 치고 "-fno-objc-arc" 옵션을 적용해주면 된다.
그런데, ARC을 사용하는데 있어서 제약사항이 전혀 없는건 아니다.
ARC is supported in Xcode 4.2 for Mac OS X v10.6 and v10.7 (64-bit applications) and for iOS 4 and iOS 5. Weak references are not supported in Mac OS X v10.6 and iOS 4.
Xcode 4.2 for Snow Leopard does support ARC for iOS though, and Xcode 4.2 for Lion supports both Mac OS X and iOS. This means you need a Lion system to build an ARC application that runs on Snow Leopard.Xcode 4.2 for Snow Leopard는 지원 안되고, OSX 10.6에서는 Weak 참조를 사용할 수가 없다. 결론은... 제대로 쓰려면 Lion을 깔아서 써라.
ARC로 컴파일된 소스는 iOS4.3에도 Deploy가 되니 하위 버젼 호환에 대해서는 큰 걱정을 안해도 된다.
사용해보기 이전에 제약사항에 대해서 먼저 알아본 것은 실컷 공부했는데 나중에 알고보니 어떤 제약이 있어서 쓸 수 없는 상황을 미연에 막기 위해서이다.
그럼 ARC란 무엇인가? retain/release하던 걸 빼고 app_code만 작성하게 해주는 컴파일 속성이다. 사람이 짜는 코드이다 보니 retain/release 쌍이 안 맞아 다양한 버그를 만들곤 하는데 이 걱정을 안하게 해주는 고마운 놈이다.
과거엔 이렇게 했다면,
MyObj *o = [[MyObj alloc] init];ARC에서는 [o release]; 하지 않는다. release를 안 해도 컴파일러시에 자동으로 추가된다고 알면 된다.
...
[o release];
그리고, ARC을 위해 두가지 속성이 추가되는데 strong과 weak이다.
strong은 retain 개념으로, weak은 assign 개념으로 보면 되겠다. (하단 자세한 설명 추가)
다음 코드를 보자.
@interface Person : NSObject @property (nonatomic, strong) NSString *firstName; @property (nonatomic, strong) NSString *lastName; @property (nonatomic, strong) NSNumber *yearOfBirth; @property (nonatomic, strong) Person *spouse; @end @implementation Person @synthesize firstName, lastName, yearOfBirth, spouse; @end
예전의 경험대로라면 aPerson 과 NSNumber 할당한 놈에 대해 메모리가 새는 걸 막을려는 충동을 느낄테지만 ARC에서는 위 코드가 정상이다. ARC에서는 release 짝 맞추려는 노력을 하지 않아도 된다는 것이다!
- (void)contrived { Person *aPerson = [[Person alloc] init]; [aPerson setFirstName:@"William"]; [aPerson setLastName:@"Dudney"]; [aPerson:setYearOfBirth:[[NSNumber alloc] initWithInteger:2011]]; NSLog(@"aPerson: %@", aPerson); }
그런데, 혹자는 ARC를 사용할 경우 메모리해제가 정상적으로 되지 않는다고도 한다. aPerson = nil; 처럼 nil을 넣어줬더니 정상적으로 해제가 되더라는 사람도 있고, ... 아직 익숙하지 않아서 그렇게 느끼는 건 아닐지....
아무튼 ARC를 사용할 때 얻는 장점이 많기 때문에 앞으로 시작하는 프로젝트에 대해서는 ARC만 사용해서 쓰는 걸 추천한다. 더 자세한 내용은 아래 참고자료를 참고하고, ARC 기본설명은 여기에서 마무리한다.
* 참고자료
- Transitioning to ARC Release Notes
[ 추가 설명 ]
잠시 ARC에 대해 짚고 넘어가자면, ARC는 객체를 참조한 횟수 (Refrence Count)와 변수의 유효영역 규칙(Scope Rule)에 따라 객체를 해제하는 것을 의미하며, 변수를 사용하고 해제 할 때 참조횟수가 1이 감소하고 이 값이 0이하이면 객체를 알아서 해제 하는 이론으로 동작한다. 이를 위해 Objective-C Compiler는 객체가 생성된 영역을 벗어날 경우 그 위치에 객체 소멸코드를 자동으로 삽입하여 컴파일. 물론 컴파일 단계에서 진행되므로, 소스코드 단계에서는 코드가 보이지 않는다. ARC의 개념에 대해서는 자세한 설명이 웹엔 없었는데, Xcode 4 서적 중에 설명되어 있는 부분이 있어 참조.
반응형
'옛글 > 아이폰 프로그래밍' 카테고리의 다른 글
[iOS프로그래밍] Xcode 4.2 Bad Access 오류는 NSZombieEnabled로 잡자! (1) | 2012.05.03 |
---|---|
[iOS프로그래밍] Appdelegate (0) | 2012.05.03 |
[iOS프로그래밍] NSArray와 NSString (문장 잘라내기) (0) | 2012.04.28 |
[iOS프로그래밍] Objective-C와 JAVA (1) | 2012.04.25 |
[iOS프로그래밍] UIWebview로 url을 띄워보기 (0) | 2012.04.23 |