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

------- 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值