黑马程序员——oc加强学习(协议)

来源:互联网 发布:纸飞机软件exe 编辑:程序博客网 时间:2024/05/22 13:13

------- android培训、java培训、期待与您交流! ----------


 什么是协议?

         一些方法的声明,一般写到一个.h的头文件中

        方法有两种:

        1)必须实现

        2)选择实现

 

    协议的作用;

        供其他的类去遵守,

        如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法


  如何定义一个协议:

 

        @protocol xxx<NSObject>

 

        @end

 

        类遵守协议的格式:

 

        1)遵守一个协议:

 

        先导入头文件

 

        @interface 类名:NSObject<xxx>

 

        @end

 

        2)遵守多个协议

        

         @interface 类名:NSObject<xxxaaa,bbb>

 

         @end


workProtocol.h文件

#import <Foundation/Foundation.h>@protocol workProtocol <NSObject>-(void)work;@end

baseProtocol.h文件

//定义一个协议#import <Foundation/Foundation.h>//基础协议//eat run//Person 采纳这个协议//使用协议的流程://定义协议//让类遵守这个协议//实现协议中对应#import "workProtocol.h"@protocol baseProtocol <NSObject,workProtocol>//声明一些方法-(void)eat;-(void)run;@end

Person.h文件

#import <Foundation/Foundation.h>//1.导入头文件//2.遵守协议//3.实现方法#import "baseProtocol.h"//#import "workProtocol.h"//当我们遵守了某个协议后,就有了协议中方法的声明@interface Person : NSObject<baseProtocol>@end


Person.m文件

#import "Person.h"@implementation Person-(void)eat{        NSLog(@"正在吃");    }-(void)run{    NSLog(@"跑得快");}-(void)work{    NSLog(@"努力工作");}@end

main.m文件

#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                Person *p = [Person new];        [p eat];        [p run];                [p work];            }    return 0;}

@required和@optional关键字

#import <Foundation/Foundation.h>@protocol baseProtocol <NSObject>//@required和@optional都是协议中的关键字//@required修饰的方法是必须要实现的//默认情况下都是必须要实现的@required-(void)run;-(void)eat;//@optional修饰的方法是可以选择实现@optional-(void)dajia;@end

@protocol类型限制

#import <Foundation/Foundation.h>#import "Girl.h"#import "Dog.h"#import "houseHoldProtocol.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                Dog *d = [Dog new];        Girl *mm = [Girl new];        //增加类型限制        //第一种类型限制:给id类型增加限制        //id<houseHoldProtocol> obj;        //增加<houseHoldProtocol> 以后,表示,obj只能赋值遵守了这个协议的对象        id <houseHoldProtocol> obj = mm;                //第二种类型限制        //表示,obj2赋值的时候,必须是Girl对象,并其遵守了协议。        Girl<houseHoldProtocol> *obj2 = mm;                //第三种类型限制        obj2.dog = d;            }    return 0;}

id和instancetype的区别

1)instancetype只能作为函数或方法的返回值

2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量

3)instancetype对比id的好处

能精确的限制返回值的具体类型


protocol代理设置模式概念

代理模式的应用场合

    1.监听器的场合

        teacher想监听baby 的一些行为

    2.通知的场合

        baby发生了一些行为,想告知teacher

    3.有些事情,自己不能做



0 0