类目 (category)
-
对现有的类添加扩展,如:系统中的类,在类目中添加的方法会被子类继承,而且运行时跟其他的方法没有区别。
-
作为子类的替代方式,不需要定义和使用一个子类,可以通过类目直接向已有的类目里添加方法。
对类中的方法进行归类,利用categopry把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护。通过类目添加的方法会成为原始类 的一部分
注意:
当然也有使用Category是需要注意的问题:
- Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现,或者利用runtime实现。
- Category可以重载原始类的方法,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
- 和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。
- 命名方式: 类名+扩展方法,如“UIAlertView+AFNetworking”。类目的接口声明与类的定义十分相似,但类目不继承父类,只需要带有一个括号,表明该类目的主要用 途。
Category 与SubClass 区别
分类 | Category | subclass |
---|---|---|
功能 | 只能为类添加方法 | 既能为类添加方法,又能添加属性 |
特点 | 新添加的方法会成为原始类的一部分,能被子类继承 | 新添加的方法只有子类才有,父类不具有,子类才能调用 |
代码:
类目.h文件
#import <Foundation/Foundation.h>
//类目 在类目中不能添加实例变量
@interface NSString (CSayHi)
-(void)sayHi;//类目的方法
@end
类目.m文件
#import "NSString+CSayHi.h"
@implementation NSString (CSayHi)
-(void)sayHi{//类目方法的实现
NSLog(@"这是类目提供的方法,字符内容是%@",self);
}
@end
使用
#import <UIKit/UIKit.h>
#import "NSString+CSayHi.h"
- (void)viewDidLoad {
[super viewDidLoad];
NSString *str=@"hello";//定义一个字符串对象并赋值
[str sayHi];//调用类目方法
}
延展 (Extension)
- 延展是特殊形式的类目
- 延展中定义的方法在类本身中实现
- 延展写在.m文件上
- 延展不提供名称表示方法必须实现,提供名称可以不实现
作用
定义类的私有方法,管理类的私有方法
使用
形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。
代码如下:
#import "Student.h"
@interface Student (extension)//为Student类创建一个私有的方法text
-(void)text;
@end
@implementation Student
-(void)hello;
{
[self text];
}
-(void)text
{
NSLog(@"你好");
}
@end
外界 [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。
协议 (protocol)
概念:协议(protocol)是Objective-c中一个非常重要的语言特性. 一个协议其实就是一系列有关联的方法的集合。协议中的方法并不是由协议本身去实现,相反而是由遵循这个协议的其他类来实现。
// OC的协议由@protocol声明的一组方法列表,要求其他的类去实现,
//相当于@interface部分的声明
@protocol xxxDelegate
//必须实现的协议方法
@required
//可选实现
@optional
@end
相关代码自己百度.
为什么要使用协议:
苹果的官方文档指出三个原因:
- To declare methods that others are expected to implement
- To declare the interface to an object while concealing its class
- To capture similarities among classes that are not hierarchically related
其实还有第4个很重要的原因,那就是减少继承类的复杂性。
一个经典的例子就是iOS UI框架里面的UITableViewController类。假如没有“协议”功能,用户就必须选择用继承和重载接口的方法来实现复杂的UI控制以及其他事件的处理——这就对基类的设计提出了更大的挑战了。对于像这样一个table view,一个很好的实现方法就是采用协议,由协议里的接口来控制不同的数据源以及各种复杂的用户操作。UIKit中设计了两个很好的协议UITableViewDelegate,UITableViewDataSource来实现UITableViewController的控制。任何遵循这两个协议的类都可以实现对UITableView的控制。
代理与协议的区别:
代理是一种设计模式概念,协议是一种技术,代理是用协议来实现的.代理是2个对象之间通讯的一种方式。 代理主要做反向传值的。实现系统的一些回调方法.
至于代理的详细信息,不是本篇的重点,足可以另开一篇文章详谈了.
今天就到这.
网友评论