iOS纪录-类别、扩展和继承的概念

1.类别(category)应用非常常见,特别是在为系统类进行扩展的时候,我们可以不用继承系统类,直接给系统类添加方法。最大程度上体现了OC语言的动态性。但是类别只能添加方法不能添加属性。

2.扩展(Extention)

3.继承(inherit),一个类(子类)继承于另一个类(父类),那么子类不仅拥有父类所有的属性和方法,而且可以创建属于自己的属性和方法。

4.类别和继承的使用,以下两种情况只能使用继承,类别无法实现。第一种,新扩展的方法与原方法同名,但是还需要使用父类的实现。因为类别会覆盖原类的实现,无法访问到原来的方法。第二种,扩展类的属性,这个类别无法做到。以下两种情况最好使用类别,第一种,针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。第二种,类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。


分类(Category)
 
分类能够做到的事情主要是: 即使在你不知道一个类的源码情况下,向这个类添加扩展的方法
 
此外,分类能够保证你的实现类和其他的文件区分开。
 
1 #import “UIViewController.h”
2 @interface UIViewController(CustomView)
3 -(void)extMethod;
4 @end

 

  使用分类为类添加方法(Add Methods to Classes)
 
通过在interface中声明一个额外的方法 并且在implementation 中定义相同名字的方法即可。分类的名字(也就是括号括起来的CustomView)表示的是: 对于声明于其他地方的这个类(UIViewController),在此处添加的方法是额外的,而不是表示这是一个新的类你不可以通过分类为一个类添加额外的成员变量
 
在implementation中,引入头文件的时候主要引用的方式是:
 
1 #import “UIViewController+CustomView.h”
2 @implementation UIViewController(CustomView)
3 -(void)extMethod;
4 @end

 

 另外,虽然Category不能够为类添加新的成员变量,但是Category包含类的所有成员变量,即使是@private的。Category可以重新定义新方法,也可以override继承过来的方法。
 
类扩展(Class Extensions)
 
类扩展就像匿名( 也就是没有那个括号里面的名字CustomView)的分类一样,除了一样不同的是,类扩展声明必须在@implementation在实现。
 
先看一段代码:
复制代码
 1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7  
 8 @interface MyObject(Setter)
 9 -(void)setNum:(NSNumber*)num;
10 @end
11  
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }
复制代码

 

 看上面这段代码,有没有问题?编译器编译的时候,这段代码是可以编译通过,但当运行时,就会报错。为什么?
 
因为没有实现Category中的setNum方法。而用类扩展去实现,请看:
复制代码
 1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7  
 8 @interface MyObject() //注意这里的括号里面是没有名字的
 9 -(void)setNum:(NSNumber*)num;
10 @end
11  
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }
17  
18 -(void)setNum:(NSNumber*)num
19 {
20 number = num;
21 }
22 @end
复制代码

 

 setNum是必须要实现,不然编译器会提出警告。
 
从上面看出,分类和类扩展的相似之处是: 都可以为类添加一个额外的方法
 
不同之处在于: 要添加额外方法,分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展,你添加的方法是一个required API,如果不去实现,编译器会警告,而且这个方法的声明可以不在第一个@interface中去声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值