본문 바로가기

iOS/Objective C

[Objective-C] 3. 프로토콜(Protocol)

1. 프로토콜(Protocol)

프로토콜은 선언만 되고 구현이 되지 않은 객체 지향의 흔한 개념인 인터페이스를 의미한다. 작성법은 다음과 같다.

@Protocol 프로토콜명 : NSObject

메서드 정의

@end

이런 프로토콜은 다른 클래스에서 구현할 수 있다. 이 때, '프로토콜을 따른다'라고 표현한다.

 

2. 프로토콜(Protocol)을 따르는 클래스

Flyable.h

@protocol Flyable 

- (void)fly;

@end

 

KingFisher.h

@interace KingFisher <Flayable>
@end

KingFisher.m

@implementation KingFisher

- (void)fly {
    NSLog(@"Fly High");
}

@end

 

 

3. Delegate Pattern

Delegate Pattern은 iOS 개발 과정에 많이 사용되는 패턴이다. 특정 작업을 다른 클래스로 위임할 때 사용하는 패턴이다. 사용되는 예제는 다음과 같다.

 

"특정 아이템을 클릭했을 때, ViewController에서 이를 처리하는 시나리오"

 

[Bad Case]

UIViewContoller.m

@implemenatation ViewController

...

-(void)onTouchedComplete:(UITableViewCell*)cell {
    //Do Something onTouchedComplete..
}

@end

 

이 기능을 UITableViewCell에서 호출하면 어떨까?

MyTableViewCell

//MyTableViewCell.h
@interface MyTableViewCell : UITableViewCell 

@property(...)ViewController *viewController;

@end


//MyTableViewCell.m
@implemantation MyTableViewCell.m

- (IBAction)onTouchCompleteButton:(UIButton *)button {
    [self.viewController onTouchComplete:self];
}

@end

UITableViewCell은 onTouchComplete만 호출하고 싶을 뿐인데 UIViewController의 모든 프로퍼티, 메서드에 접근이 가능해지는 상태가 되었다. 이 같은 상황을 방지하기 위해 Delegate Pattern을 사용한다.

 

 

[Good Case]

ButtonActionDelegate.h

@protocol ButtonActionDelegate

-(void)onTouchedComplete:(UITaableViewCell *)cell;

@end

 

MyTableViewCell.m

@implementation MyTableViewCell {
    id<ButtonActionDelegate> delegate;
}

-(IBAction)onTouchedCompleteButton:(UIButton*)sender {
    [self.delegate onTouchedComplete:self];
}

@end

 

UIViewController

//ViewController.h
@interface ViewController: UIViewController <ButtonActionDelegate>
...
@end


//ViewController.m
@implemenatation ViewController

...

-(void)viewDidLoad() {
    myTableViewCell.delegate = self;
}

-(void)onTouchedComplete:(UITableViewCell*)cell {
    //Do Something onTouchedComplete..
}

@end

 

 

 

'iOS > Objective C' 카테고리의 다른 글

[Objective-C] 2. Class - Method & Property  (0) 2022.02.27
[Objective-C] 1. 개요  (0) 2022.02.27