一 类目
类目:也称为类别,分类,用于扩展现有类,为其添加新的方法,不可以添加成员变量。
注意:新添加的方法与原有方法同级,可以被继承;
可以为同一类添加多个类目,但类目名和方法名不能重复,不要随意重写类中的方法;
案例:
//为NSString添加一个sayHello方法
#import "NSString+SayHello.h"
@implementation NSString (SayHello)
//实现方法
-(void)sayHello
{
NSLog(@"大家好,我是开发者");
}
在main中:
结果为:大家好,我是开发者
//在同一个NSString+SayHello.h文件下 为
NSMutableString写一个拼接方法
然后实现他:
main函数实现:
结果为: mycopystring
//为NSMutableArray添加一个倒序方法
实现:
main函数实现:
结果:
类目可以访问其继承的类的实例变量,类目的方法具有最高级的优先级,即它会覆盖掉原来类中相同名字的方法;
类目的局限性:
类目只能给已有的类添加方法,无法添加实例变量,类目没有位置容纳实例变量。
此时可以通过字典类型的参数解决。
如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级要高。
即调用这个方法时,类目中的方法会覆盖掉原来类中的方法,为了避免这种情况发生,类目中的方法名不要和原来类
中的方法名字相同。
二 延展
延展:为类添加私有方法
案例:
在Student.h文件中
在Student.m文件中实现
在main函数中:
总结:
类目和延展的区别:类目(category)和延展(extension)的不同在于后者可以添加属性,另外后者添加的方法必须要实现
延展可以认为是一个私有的类目。
三 协议
在Objective-C中,一个类可以实现多个协议,通过协议可以弥补单继承的缺陷。但是协议跟继承不同,协议只是一个方 法列表,方法的实现得靠遵循该协议的类去完成。
协议的声明和类的声明类似,不过协议的声明是用@protocol声明的一组方法列表。
列表中的方法是由其他的类去实现,相当于类的@interface部分的声明
方法的声明中,两个关键字:
@required标注的方法为必须实现的方法;
@optional标注的方法为可以选择实现;
语法:
@protocol 协议名称
//方法列表
@end
案例:
//在协议SaleHouseProtocal.h文件中
//声明一个协议
接下来:
//新建一个HouseHold类,相当于接收到这个协议,并管理这个协议,需要找个代理来实现这份协议(即寻找合适者签这份协议)
//在HouseHold.h文件中
//HouseHold.m文件中
接下来:
新建一个Manager类为delegate代理者
//在Manager.h文件中
在Manager.m文件中
在main函数中:
结果为:
注意:在实现协议的时候,不光能实现一个协议,一个类可以同时遵循多个协议
语法:
@interface ClassName:父类名<协议1,协议2...>
@end
@implementation ClassName
//实现协议中的方法
@end
总结:
协议声明了可以被任何类实现的方法。
协议不是类,它是定义了一个其他对象可以实现的接口。
如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
协议与数据类型,协议可以当做变量,参数类型限定。
在使用委托的时候,注意循环引用问题,委托的属性要使用assign,不要用retain。