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 |