Develop
2014.03.17 15:42
[ios] Objective-C 프로퍼티의 strong, weak, assign
조회 수 4689 댓글 0
첨부 '1' |
---|
ARC가 나오면서 assign, retain, copy 는 쓰이지 않고 대신 새로운 Property로 strong, weak이 추가되었다.
[참고]
assign vs. retain vs. copy- setter 에서 객체를 지정 받을 때assign : 주소값만 지정받고,retain : 기존것을 release 한 후 새로 받은 걸 retaincopy : 기존것을 release 한 후 새로 받은 걸 copy- retain, release, autorelease 를 적어주는 대신에 ARC ( Auto Reference Counting )에서 알아서 이를 compile time 에 지정해줌.atomic vs. nonatomic- 기본값은 atomic- 멀티스레딩에서는 atomic 사용.- 보통은 nonatomic 을 사용.
알다시피 strong은 강한 참조, weak은 약한 참조라는 의미이다. iOS 4.x에서 썼던 retain, assign(≒ unsafe_unretained)의 대체 개념이라고 알고 있는데 어떤 개념으로 쓰이는 것일까? 그리고 weak과 assign은 어떻게 다른 것일까? 이런 궁금증이 발동하여 테스트 코드를 작성해보았다. 아래 코드를 보자.
@interface SMViewController () @property (nonatomic, strong) NSObject *strongObj; @property (nonatomic, weak) NSObject *weakObj; @property (nonatomic, assign) NSObject *assignObj; @end @implementation SMViewController - (void)printAddress { NSLog(@"strong addr : 0x%x", (unsigned int)self.strongObj); NSLog(@"weak addr : 0x%x", (unsigned int)self.weakObj); NSLog(@"assign addr : 0x%x", (unsigned int)self.assignObj); } - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"> init values"); self.strongObj = [[NSObject alloc] init]; self.weakObj = self.strongObj; self.assignObj = self.strongObj; [self printAddress]; NSLog(@"> set strongObj to nil"); self.strongObj = nil; [self printAddress]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSLog(@"> move another stack"); NSLog(@"> will die at assignObj"); [self printAddress]; }
코드의 내용은 strong, weak, assign 값을 선언하고 strongObj에 Object을 할당한 다음 weakObj와 assignObj에 strongObj을 세팅하고 생명주기가 어떻게 되나 살펴보는 내용이다.
결과는 이러했다.
> init values
strong addr : 0x6a20320
weak addr : 0x6a20320
assign addr : 0x6a20320
> set strongObj to nil
strong addr : 0x0
weak addr : 0x6a20320
assign addr : 0x6a20320
> move another stack
> will die at assignObj
strong addr : 0x0
weak addr : 0x0
== BAD ACCESS ==
처음 시작할 때는 strongObj의 강한 참조값이 살아 있어 weakObj, assignObj의 주소값이 모두 찍힌다. strongObj값을 날려버리고 난 후에는 strongObj의 주소는 0x0이 되고 다른 Obj들은 그대로이다.
그런데 결과의 12라인을 보면 다른 스택으로 넘어가는 순간 weakObj의 주소값이 0x0으로 바뀐 걸 알수가 있다. 코드로 아무런 조치도 안 했는데 자동으로 값이 바뀐 것이다. weakObj의 약한 참조가 strongObj의 오브젝트가 메모리에서 사라지면서 풀려버린 것이다!! (ARC를 쓰면 오브젝트에 대한 BAD ACCESS의 위험이 대폭 줄어들 것이라는 예상을 할 수가 있다.)
그리고 그 다음 라인에서 assignObj의 주소값을 찍으려는 순간 앱은 BAD ACCESS 내뱉고 죽어버린다. assignObj가 가지고 있는 address의 오브젝트에 대한 잘못된 접근을 했다는 말인데 메모리에서 오브젝트가 사라지더라도 값은 그대로 남아있어 문제를 일으켰다는 것을 알 수 있다.
이 간단한 테스트로 weak과 assign의 차이를 알 수 있고, strong, weak의 쓰임, assign의 쓰임에 대해서도 얼핏 짐작할 수가 있다.
정리하면, strong, weak은 오브젝트을 참조할 때 쓰고, assign은 int, float, double 등과 같은 primitive type에 대해값을 할당할 때 쓰면 되겠다.
[참고] https://www.hooni.net/xe/57912
[출처] http://simyungk.tistory.com/36
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
789 | Develop | [c] 코드 최적화에 대해.. | hooni | 2013.04.23 | 7656 |
788 | Develop | [c] 콘솔에서 패스워드 입력시 문자 보이지 않게 하는 코드 | hooni | 2013.04.23 | 8329 |
787 | Develop | [c] 퀵정렬(quick sort) 예제 소스.. | hooni | 2013.04.23 | 7976 |
786 | Develop | [c] 테트리스(Tetris) 게임(도스용) 소스코드 | hooni | 2003.04.23 | 11477 |
785 | Develop | [c] 테트리스3D (Tetris 3D) | hooni | 2013.04.23 | 7107 |
784 | Develop | [c] 텍스트 파일(로그)을 정해진 라인 단위로 쪼개주는 코드 | hooni | 2013.04.23 | 7050 |
783 | Develop | [c] 파이프(popen)로 다른 프로세스 실행결과 가져오기 | hooni | 2013.04.23 | 8401 |
782 | Develop | [c] 파일 복사(copy) 프로그램 샘플 소스 | hooni | 2003.04.23 | 6770 |
781 | Develop | [c] 파일(File) 관련 함수 샘플 코드 | hooni | 2003.04.23 | 7460 |
780 | Develop | [c] 파일(File)의 연결과 연결 해제 (link, unlink, chown) | hooni | 2013.04.23 | 9545 |
779 | Develop | [c] 파일(int fd)에서 개행문자 단위로 읽기 by 후리자 | hooni | 2013.04.23 | 7152 |
778 | Develop | [c] 파일명 또는 특정 패턴을 적용 | hooni | 2016.08.03 | 759 |