在ios中,给类添加方法有两种方式:继承和类别。
1. 继承
继承时面向对象的三大特性之一,子类会继承父类的所有方法和属性。
2 类别
类别(其实我更喜欢翻译为分类)是oc的特性,可以在不改变原类及继承父类的前提下,实现对类方法的扩展。
既然继承和类别都可以扩展类方法,那类别存在的理由是什么呢?
1. 不改变原类的条件下,想类添加方法,这点继承做不到。
2. 可以把相关的方法分组到多个单独的文件中,便于管理(“分类”)。
这样是很方便的,所以可以很多项目都可以看大分类的使用。
当然,分类也有他的局限:如果扩展方法名和原类名相同,则会覆盖掉原类的方法,这是要注意的,还一个是分类无法扩展类的属性。
文件形式的区别:
继承:既然是子类, 必须是要创建 .h 跟 .m文件
分类:可以用创建 .h 跟 .m文件的形式。
也可以在原来的类中添加。比如常用的UIView的分类一样
@interfaceUIView(UIViewGeometry)。
@end
方法上的区别:
继承:可以定义跟父类中一样的方法名。
如果在.m文件中没有实现,那不用说肯定是调用父类的方法,当然这样就没什么意义了。
如果你实现了,相当于重写父类方法,也算是跟父类没什么关系了。如果使用super指针调用父类的方法,相当于调用父类的实现方法。不影响子类自己的实现。
例如- (void)viewDidLoad {
[super viewDidLoad];
[self setView];
}
分类:可以跟类一样的方法名。
这样的话分类的优先级高于类。如果在.m文件实现了方法,相当于覆盖了类中的方法。
属性,成员变量的区别:
继承:可以定义属性 可以定义成员变量。可以定义跟父类一样的属性,但是没什么实际意义。
分类:按道理说不能定义属性(因为不能自动生成setter和getter方法)。但是现在有了runtime, 也就可以了。
注意基本数据类型(int 跟long)这些需要申明成NSNumber类型(OC类型),不然会抱ARC错误。
有一点,分类是肯定不能添加成员变量的。
具体runtime如下
--------------------
在匿名分类或者头文件中添加属性。
区别是:匿名分类中添加的是私有属性,只在本类中可以使用,类的实例中不可以使用。头文件中添加的在类的实例中也可以使用。
//分类的头文件
@interfaceClassName(CategoryName)
//我要添加一个实例也可以访问的变量所以就写在这里了
@property (nonatomic, strong) NSString *str;
@end
//匿名分类: 我们平时在.m文件中的这个方法
@interface ViewController()
@end