继承跟分类

在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,655评论 8 265
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 2018-01-25今年雪下得意外持久,足足持续了一星期,天气预报也总算猜对了一回。也不见得消停下来。站在公交车站...
    One2INF阅读 187评论 0 0
  • 有种女孩儿,天生不敢依赖。她经济独立,自己养自己;她身体单薄,但体力活儿从不叫人帮忙;她性格自立,打理的好自己的一...
    莫小北xm阅读 575评论 1 3
  • 使用Haproxy Haproxy是目前比较流行的一种集群调度工具 四层负载均衡;七层负载均衡;Haproxy 与...
    麦子先生R阅读 830评论 0 2