Category:
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
解决方法有两种:
- 使用Category: 在delegate类中使用Category声明并实现主类所需的方法
- 使用Protocol:主类中的delegate声明为id <MyProtocol>delegate;并包含MyProtocol的声明;delegate类声明遵从MyProtocol协议
推荐使用第二种,语义更加明确。