一、类目:

类目:也称类别、分类。

类目:类别(category)是对于一个功能完备的类的一种补充,就像是一个东西基本的功能都完成了,可以用类别为这个类添加不同的组件,使得这个类能够适应不同的情况的需求。类目可以为一个现有的类扩展新的方法,扩展的方法会成为原始类的一部分,子类可以继承通过类目扩展的方法。oc语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法的扩展。

类别文件的命名:原类的名称+扩展标识名

继承:多个类具有相同的实例变量和方法时,考虑用继承。即子类可以继承父类的相同的特性。面向对象语言都有的一个特性。

相同点:都是可以重写父类的方法,都是给一个类进行扩展。

区别:

1、类目是对方法的扩展,不能添加成员变量。继承可以在原来的父类的成员变量的基础上,添加新的成员变量。

2、类别只能添加新的方法,不能修改和删除原来的方法。继承可以增加、修改、删除方法。

3、类别不提倡对原有的方法进行重载。继承可以通过使用super对原来的方法进行重载。

4、类别可以被继承,如果一个父类中定义了类别,那么子类中也会继承次类别。

只能使用继承,不能使用类别的情况:

1》新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。(类别的优先级比较高)。

2》扩展类的属性,这个类别无法做到。

继承的代码示例:

继承的示例:自定义一个UITableViewCell继承于UITableViewCell

代码部分:

chatCell.h
 
 
#import <UIKit/UIKit.h>
@interface ChatCell :UITableViewCell
 //继承的方法,成员变量
 
  
 @end
 
   ChatCell.m 
  
//方法的实现
 
  
#import "ChatCell.h"
 ChatCell ()
 {

如:

UIMenuItem *copyItem;//复制
UIMenuItem *transmitItem;//转发
UIMenuItem *deleteItem;//删除
 }
 (nonatomic,strong)UILabel *timeLabel;
 。。。
 @end
 
 
 
 
 
 
 ChatCell
 
 

   //方法实现 
 
 
 @end

使用类别的情况:

1》针对系统提供的一些类(如:NSString、NSArray、NSNumber等),系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行扩展。

2》类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提供可维护性,并简化单个源文件的管理。

类别 示例:扩展UIImage的 stretchImageWithImageName方法

代码:

UIImage+Stretch.h文件
 
#import <UIKit/UIKit.h>
 
@interface
UIImage *)stretchImageWithImageName:(NSString *)imageName withWidth:(CGFloat)stretchWidth withHeight:(CGFloat)stretchHeright;
 @end
 
 
UIImage+Stretch.m文件
 
 
#import "UIImage+Stretch.h"
 
@implementation
UIImage *)stretchImageWithImageName:(NSString *)imageName withWidth:(CGFloat)stretchWidth withHeight:(CGFloat)stretchHeright{
UIImage *image = [UIImageimageNamed:imageName];
    return [imagestretchableImageWithLeftCapWidth:stretchWidthtopCapHeight:stretchHeright];
 }
 @end

注:此处的代码只是在ios中的定义,没有书写具体的例子。

定义的总结:

定义类别:父类名(扩展名)

定义继承:子类名:父类名