objc_setAssociatedObject ( Associative references ) 사용하기

2012. 8. 21. 21:08iOS

오랜만에 남기네요 ..


요즘들어 코딩하면서 자주 사용하는 Associative references 를 이야기 해볼려고 합니다 


자세한 설명은 


http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocAssociativeReferences.html



http://lambert.tistory.com/m/post/view/id/559


에서 참고하시면 더욱 도움 되실것입니다 .


associative reference를 잘 활용하면 아주 쓸만하다. 

단 associative reference 는 주소 기반인점을 기억하면서 예제로 설명하겠다


[self drawTouchArea:CGRectMake(0, 0, 0, 0) data:@"샘플"];

#pragma mark 버튼 터치 영역을 만든다
-(void) drawTouchArea: ( CGRect ) rect data: ( id ) data
{
    UIButton *tArea = [ UIButton buttonWithType:UIButtonTypeCustom];
    tArea.frame = rect;
    tArea.backgroundColor  = [UIColor clearColor];
    [self addSubview:tArea];
    
    objc_setAssociatedObject ( tArea, "value", data, OBJC_ASSOCIATION_RETAIN);
    
    [tArea addTarget:delegate action:@selector(gotoDetailView:) forControlEvents:UIControlEventTouchUpInside];
}



-(void) gotoDetailView : ( UIButton * ) sender { id data = objc_getAssociatedObject(sender, "value"); NSLog(@" data ] %@", data ); }


위의 예제에서 보면 우리가 흔히 쓰는 addTarget 를 통해 UIbutton 에 이벤트를 정하는것입니다 

그러나 런타임 함수인 objc_setAssociatedObject 를 통해 클래스 오브젝트 ( UIbutton ) 에 임의의 변수를 저장하였다 .


즉 핸들러를 통해서 받은 UIbutton 오브젝트 안에 임의로 넣은 변수값이 있다는것이다 

마지막 

NSLog(@"[ data ] %@", data );


에는 "샘플"이 찍히게 된다.


자세한 설명은 위의 링크를 통해서 다시한번 이해하시길 바랍니다 



p.s 

associative reference 는 런타임 함수이기 떄문에 

#import <objc/runtime.h>

를 임포트 해야만한다