Objective-C 协议、block、Category

协议protocol

在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法.
oc 中定义协议一般使用Delegate后缀(表示委托代理之意)@required 修饰的方法必须现实,@optional 修饰的为可选方法,默认没有修饰符。

AnimalDelegate 定义

《Objective-C 协议、block、Category》 AnimalDelegate.png

People.h 实现协议 在父类后面使用 <Delegate1,Delegate2>

《Objective-C 协议、block、Category》 People.h

People.m 实现类中

《Objective-C 协议、block、Category》 People.m

1.一个协议可以扩展自另一个协议,例如上面AnimalDelegate就扩展自NSObject,如果需要扩展多个协议中间使用逗号分隔;
2.和其他高级语言中接口不同的是协议中定义的方法不一定是必须实现的,我们可以通过关键字进行@required和@optional进行设置,如果不设置则默认是@required(注意ObjC是弱语法,即使不实现必选方法编译运行也不会报错);
3.协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔;
4.协议的实现只能在类的声明上,不能放到类的实现上(也就是说必须写成@interface Person:NSObject<AnimalDelegate>而不能写成@implementation Person<AnimalDelegate>);
5.协议中不能定义属性、成员变量等,只能定义方法;

java 中称为借口,使用关键字 interface。
使用 I 前缀表示借口

《Objective-C 协议、block、Category》 IAnimal

使用 implements 关键字表示实现一个接口,多接口使用逗号隔开。接口的方法在实现类中都需要重写

《Objective-C 协议、block、Category》 People

block

block 对应于java中的函数回调

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

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

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

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

分类Category

不改变原有代码为一个类扩展其他功能时我们可以考虑继承这个类进行实现,但是这样一来使用时就必须定义成新实现的子类才能拥有扩展的新功能。利用分类,我们就可以在ObjC中动态的为已有类添加新的行为(特别是系统或框架中的类)(java 没有此特性)

去掉字符串前后的空格
创建一个NSString 的 Category ,名称为Extends,xcode会生成 NSString+Extends 的.h .m文件

《Objective-C 协议、block、Category》 NSString+Extends.h

使用时 #import “NSString+Extends.h”

《Objective-C 协议、block、Category》 NSString+Extends.m
《Objective-C 协议、block、Category》 NSString+Extends.m

    原文作者:ben_speed
    原文地址: https://www.jianshu.com/p/f860dc6f7c9a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞