Category vs Protocol

Category:

  • 用来扩充类中的方法(包括可以添加自己的方法到Cocoa Framework中)
  • 作为子类,代替继承
  • 用来将类的实现分为几个部分(实现私有方法)
  • 用来声明非正式协议(声明的所有方法不必都实现)

 

Extension:

语法上相当于匿名Category,不同之处在于Extension声明的所有方法必须都实现。

Extension的典型用法是声明私有方法,比用Category声明的私有方法更好,编译器能帮助检查。

下面使用Category声明和实现的私有方法可以通过编译器检查,注意setNumber:方法并未实现,编译正常,运行将报错:

 

下面是使用Extension的实现:

 

注意Extension的语法圆括号中没有参数

setNumber:方法必须出现在主@implementation中(即不能实现为Category),否则编译器将给出警告。

 

Protocol:

相当于Java中的interface,实际上java中的很多设计思想都与Objective-C相似

  • 声明了期望其他类来实现的方法
  • 声明一个对象的接口然而隐藏该类
  • 用来组织类似功能的类,即便它们之间不存在继承关系

Formal Protocols (正式协议):

 

注意@optional,@required 的使用

 

Informal Protocols (非正式协议):

即通过Category来实现

 

 

当实现delegate方法时,一般delegate的类型设为id,因此编译器无法检查delegate上的方法,所以会有警告产生no xxx method found

解决方法有两种:

  1. 使用Category: 在delegate类中使用Category声明并实现主类所需的方法
  2. 使用Protocol:主类中的delegate声明为id <MyProtocol>delegate;并包含MyProtocol的声明;delegate类声明遵从MyProtocol协议

推荐使用第二种,语义更加明确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值