协议用来声明方法,一个类只要遵守了Protocol,就拥有了这个协议的方法声明
父类遵守的话,子类也遵守了
一个协议遵守了其他协议就相当于拥有了其他协议中的方法声明
一个类可以遵守多个协议,一个协议也可以遵守多个协议
所有类的基类NSObject
所有协议的基协议NSObject
NSObject协议声明了很多基本的方法,比如description、retain、release等
协议分为正式协议和非正式协议
@optionoal关键字声明的方法可选实现
@required关键字声明的方法必选实现
遵循它的类必须实现必选实现
如果遵循它的类没被设置代理的话,自己可选择适当的时候进行协议方法的调用
#import <Foundation/Foundation.h>
@protocol TestProtocol <NSObject>
@optional
- (void)testOptional;
@required
- (void)testRequired;
@end
#import <UIKit/UIKit.h>
#import "TestProtocol.h"
@interface ViewController : UIViewController
@property (nonatomic, weak)id<TestProtocol>delegate;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.delegate testRequired];
}
@end
#import "TestProtocol.h"
#import "ViewController.h"
@interface TwoViewController ()<TestProtocol>
@end
@implementation TwoViewController
- (void)viewDidLoad {
[super viewDidLoad];
ViewController *vc = [ViewController new];
//设置代理
vc.delegate = self;
}
//代理实现
- (void)testRequired{
NSLog(@"this is a testDemo");
}
从上面的代码可以看出,ViewController没有遵循协议,但它设置了遵循协议的一个代理属性delegate,
TwoViewController遵循并实现了代理,至于TwoViewController什么时候调用协议方法,是由ViewController来决定的。 [self.delegate testRequired];
如果TwoViewController没被设置代理的话,自己可选择适当的时候进行协议方法的调用
- (void)viewDidLoad {
[super viewDidLoad];
// ViewController *vc = [ViewController new];
// vc.delegate = self;
[self testRequired];
}
- (void)testRequired{
NSLog(@"this is a testDemo");
}
多态,父类的指针指向子类的对象,子类重写父类的方法
有继承才有多态