一、类目:
类目:也称类别、分类。
类目:类别(category)是对于一个功能完备的类的一种补充,就像是一个东西基本的功能都完成了,可以用类别为这个类添加不同的组件,使得这个类能够适应不同的情况的需求。类目可以为一个现有的类扩展新的方法,扩展的方法会成为原始类的一部分,子类可以继承通过类目扩展的方法。oc语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法的扩展。
类别文件的命名:原类的名称+扩展标识名
继承:多个类具有相同的实例变量和方法时,考虑用继承。即子类可以继承父类的相同的特性。面向对象语言都有的一个特性。
相同点:都是可以重写父类的方法,都是给一个类进行扩展。
区别:
1、类目是对方法的扩展,不能添加成员变量。继承可以在原来的父类的成员变量的基础上,添加新的成员变量。
2、类别只能添加新的方法,不能修改和删除原来的方法。继承可以增加、修改、删除方法。
3、类别不提倡对原有的方法进行重载。继承可以通过使用super对原来的方法进行重载。
4、类别可以被继承,如果一个父类中定义了类别,那么子类中也会继承次类别。
只能使用继承,不能使用类别的情况:
1》新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。(类别的优先级比较高)。
2》扩展类的属性,这个类别无法做到。
继承的代码示例:
继承的示例:自定义一个UITableViewCell继承于UITableViewCell
代码部分:
chatCell.h
#import <UIKit/UIKit.h>
@interface ChatCell :UITableViewCell
//继承的方法,成员变量
//方法的实现
#import "ChatCell.h"
@interface ChatCell ()
{
如:
UIMenuItem *copyItem;//复制
UIMenuItem *transmitItem;//转发
UIMenuItem *deleteItem;//删除
}
@property (nonatomic,strong)UILabel *timeLabel;
。。。
@end
@implementation ChatCell
//方法实现
@end
使用类别的情况:
1》针对系统提供的一些类(如:NSString、NSArray、NSNumber等),系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行扩展。
2》类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提供可维护性,并简化单个源文件的管理。
类别
示例:扩展UIImage的
stretchImageWithImageName方法
代码:
UIImage+Stretch.h文件
#import <UIKit/UIKit.h>
@interface UIImage (Stretch)
+(UIImage *)stretchImageWithImageName:(NSString *)imageName withWidth:(CGFloat)stretchWidth withHeight:(CGFloat)stretchHeright;
@end
UIImage+Stretch.m文件
#import "UIImage+Stretch.h"
@implementation UIImage (Stretch)
+(UIImage *)stretchImageWithImageName:(NSString *)imageName withWidth:(CGFloat)stretchWidth withHeight:(CGFloat)stretchHeright{
UIImage *image = [UIImageimageNamed:imageName];
return [imagestretchableImageWithLeftCapWidth:stretchWidthtopCapHeight:stretchHeright];
}
@end
注:此处的代码只是在ios中的定义,没有书写具体的例子。
定义的总结:
定义类别:父类名(扩展名)