UIView 관련된 작업을 많이 하다보니 중복되는 코드들이 너무 많이 생기고 불편했다.

간단한 예로 하나의 이미지를 포함하는 뷰를 생성하려면

    UIImageView * imageView = [[UIImageView alloc]initWithImage:image];
   
    imageView.frame = frame;
   
    [self addSubview:imageView];
   
    [imageView release];
   
    return imageView;

위와 같은 코드가 반복되어야 했다. 이런 코드를 막기위해 다른 소스를 살펴보니 전역 함수를 만들어  좀더 수월하게 함수만 호출하는 방식을 사용하였다.

예로 라벨에 대한 객체를 생성하는 함수이다.


UILabel *NaMakeLabel(CGRect frame, UIColor *backgroundColor, NSString *text, UIColor *textColor, UITextAlignment align, UIFont *font)
{
 UILabel *label = [[UILabel alloc] initWithFrame:frame];
 
 label.text            = text;
 label.textColor       = textColor;
 label.textAlignment   = align;
 label.font            = font;
   
 if(backgroundColor != nil)
  label.backgroundColor = backgroundColor;
 
 return [label autorelease];
}

이런 식으로 변하는 값을 매개변수로 받은 후 생성된 객체를 autorelease 하여 반환하였다.

하지만 이렇게 쓰는 방법에 불편한 점이 있다. 즉 autorelease 이다. 오너쉽을 포기하기 위해 autorelease를 붙이게 되는데 이 함수를 호출한 객체에서는 이 autorelease된 객체가 언제 해제될지 모르는 상황이 겪게 된다. 간단한 뷰 같으면 큰 지장이 없으나 만약 큰 이미지를 포함하게 된다면 메모리 문제가 반드시 발생하게 된다.

좀더 편한 방법이 없을까하고 고민하고있다가 필요에 위해 카테고리를 사용하던 중 UIView에 카테고리를 붙이면 어떨까? 라는 생각이 들었다.

@implementation UIView (UIView_Image)

- (UIImageView *) addImage:(UIImage *)image withFrame:(CGRect)frame {
   
    UIImageView * imageView = [[UIImageView alloc]initWithImage:image];
   
    imageView.frame = frame;
   
    [self addSubview:imageView];
   
    [imageView release];
   
    return imageView;
}



이렇게 사용하자 앞선 함수 방식보다 훨씬 코드량도 줄고 메모리 걱정도 안하게 되었다. 함수 방식의 단점인 autorelease역시 위 카테고리를 사용하게 되면 오너십 자체를 양보하기 위해 autorelease를 사용하지 않고 바로 부모 UIView 넘겨줘 부모 뷰가 소멸 시점에서 같이 소멸된다.

또한 이 객체를 핸들링하기 위해 생성된 객체를 반환을 한다.

이런 카테고리를 사용하게 되니 코드의 양도 줄어들게 되어 매우 쾌적한 코딩을 할수 있게 되었다. 아래는 UIButton을 생성하는 카테고리이다.

물론 Button을 구성하기 위한 매개변수는 다양하기 때문에 입력받은 값이 많긴하지만 여러 줄에 걸쳐 입력한 것을 단 한라인해 해결할 수있게 되었다.

또한 매개변수 외 더 필요한 조합을 위해 추가적인 카테고리 메소드를 임의를 생성해서 쓰게 되어 확장성 및 재활용성이 용이하였다.


// 취소버튼 삽입
    [i_TopMenu addButtonForTarget:self
                       withAction:@selector(onClose)
                         andFrame:CGRectMake(frame.size.width-5-45, 5, 45, 32)
                   andNormalImage:[UIImage imageNamed:@"btn_editor_cancel_normal.png"]
              andHighlightedImage:[UIImage imageNamed:@"btn_editor_cancel_press.png"]
                          andText:@"취소"
                     andTextColor:COLOR_WHITE
          andHighlightedTextColor:COLOR_FFFFFF_A60
                      andTextFont:FONT_12];

+ Recent posts