달력

07

« 2017/07 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  

'assign'에 해당되는 글 1

  1. 2012.08.20 Strong, Weak, Assign 살펴보기
2012.08.20 01:41

Strong, Weak, Assign 살펴보기 개발기술/iOS2012.08.20 01:41

ARC가 나오면서 새로운 Property로 strong, weak이 추가되었다. 알다시피 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에 대해값을 할당할 때 쓰면 되겠다.


TestWeakAssign.zip


저작자 표시 변경 금지
신고


티스토리 툴바