Objective-C 协议、block、Category

协议protocol

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

AnimalDelegate 定义

AnimalDelegate.png

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

People.h

People.m 实现类中

People.m

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

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

IAnimal

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

People

block

block 对应于java中的函数回调

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

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

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

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

分类Category

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

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

NSString+Extends.h

使用时 #import "NSString+Extends.h"

NSString+Extends.m
NSString+Extends.m
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C C...
    GrayLand阅读 1,645评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,957评论 19 139
  • 人在他乡 走在宽阔的马路上 我边走边想 想我那久违的故乡 想我那年迈的爹娘 人在他乡 走在拥挤的人群间 看夕阳西下...
    高能故事阅读 224评论 0 0
  • 所有的我从北方赶来 所有的你从南方赴约 南与北在我们的身体中交汇 所有的我看到你血液中的渴望 所有的你看到我皮肤里...
    鹿小姐在1896阅读 353评论 3 7