黑马程序员——ios学习笔记 OC 协议&Block

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

协议

常常用在代理的实现上。协议事实上是一组方法列表,它不依赖与特定的类,在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#、Java中使用interface定义接口了。协议的创建

与创建分类类似不过选择的创建的文件为Objective-C protocol(OC协议)。输入协议名,创建后会产生一个protocol.h的接口文件。

协议定义

通常,一个协议的定义是放在头文件中的,其语法形式如下:

@protocol 协议名  //一般都会在后面加上<NSObject>,表示协议的继承。
                 //方法声明;
@end

一般,在方法声明的前面,会有两个关键字进行修饰:一个是@optional,它表示声明的方法是可选的;一个是@required,它表示声明的方法是必须的。加上关键字的协议定义形式如下:

@protocol 协议名

@optional 可选方法声明;

@required 必须方法声明;

@end

 

协议在类中的声明

协议定义好以后,要在类中进行使用,首先要在类中进行协议的声明,其语

法形式如下:

@interface 类名:父类名<协议名>

@end

协议在类中的实现

协议声明好后,要在类的实现文件中定义在协议中声明的方法,其语法形式

如下:

@implementation 类名

类和协议中的声明方法的实现{

    语法;

}

@end

具有多个协议的使用

在大多数情况下,一个类中是可以使用多个协议的,其语法形式如下:

@interface 类名:父类名 <协议1,协议2,协议3,.....协议n>

协议继承

即协议2使用了协议1,其语法形式如下:

@protocol 协议名2<协议名1>

声明方法;

@end

在OC中,默认为创建的协议都是在协议中使用协议,协议名1为NSObject,

其语法形式如下:

@protocol 协议名2<NSObject>

声明方法

@end

 

newProtocol.h

<span style="font-family:SimSun;font-size:14px;"> @protocol newProtocol <NSObject>   //定义一个协议 @required             //必须实现的方法
-(void)eat; @optional            //可选实现的方法
-(void)run;-(void)sleep;@end</span>

Person.h

<span style="font-family:SimSun;font-size:14px;">#import <Foundation/Foundation.h>
#import "newProtocol.h"@interface Person : NSObject<newProtocol>   //person采用newProtocol协议 @end
Person.m
#import "Person.h"@implementation Person-(void)eat{                       //必须实现@required修饰的eat方法    NSLog(@"eating xiang!");}@end</span>

Block代码块

1. Block类型定义:返回值类型(^ 变量名)(参数列表)(注意Block也是一种类型);

2. Block的typedef定义:返回值类型(^类型名称)(参数列表);

3. Block的实现:^(参数列表){操作主体};

4. Block中可以读取块外面定义的变量但是不能修改,如果要修改那么这个变量必须声明_block修饰;

<span style="font-family:SimSun;font-size:14px;">//
//  main.m
//  block
//
#import <Foundation/Foundation.h>
typedef void (^Block)();    //将void(^)()类型命名成Block
void test (Block b){        //函数的形参为block类型
    printf("我");
    b();                    //调用block
    printf("喜欢玩LOL");
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Block b;                //定义一个block变量b
        printf("请输入一个数字:");
        int i ;
        scanf("%d",&i);
        if (i) {
            b = ^{              //给block变量赋值
                printf("很");
            };
        }else{
            b = ^{              //给block变量赋值
                printf("不");
            };
           
        }
        test(b);                //调用函数
    }
    return 0;
}</span>

 

总结:

一个协议可以扩展自另一个协议。协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔;协议中不能定义属性、成员变量等,只能定义方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值