美文网首页
OC学习总结1 继承(Inherit)和类别(category)

OC学习总结1 继承(Inherit)和类别(category)

作者: Skipper_1_422 | 来源:发表于2016-08-24 15:12 被阅读0次

1.继承Inherit
这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。

对于以下情况,无法使用类别,必须使用继承。
1)在子类中新扩展的方法与原方法同名,但是还需要使用父类的实现要用继承。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。
2)扩展类的属性和实例变量,这个类别无法做到。

  1. 子类可以继承类别中的方法。
//  ViewControllerEx.h
@interface ViewControllerEx : UIViewController
//自己需要添加的方法
@end
// ViewControllerEx.m
@implementation ViewControllerEx
// 方法的实现
@end

2.类别category
这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。
以下两种方式最后使用类别。
类别的特点:

  1. category可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
  2. 类别中的方法优先级高于类中的方法。如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法。
  3. 类别不能添加类的属性和实例变量。
  4. 类别中的方法不能调用super方法。

类别在实际中的应用:
1)针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。
2)类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

  1. category 方法可能会覆盖于同一个类class 的其它 category 中的方法。但也可能被覆盖,因为无法预知他们的加载优先顺序,出现这种情况通常会在编译时出错。如果在一个开发的SDK中使用了类别, 就最好保证类别名不同于使用者的类别名, 以及类别方法也不同于使用者的类别方法名, 通常通过加前缀来做到。
// 这里有一个约定俗成的规定,类别文件命名时,是原类名+扩展标识名
//  NSString+ex.h
@interface NSString (ex)
// 扩展的类回别方法
@end
//  NSString+ex.m
@implementation NSString (ex)
// 方法的实现
@end

3.类的扩展
OC中的扩展只是在.m文件中@implementation之上加一段@interface~@end,在其中声明变量属性和方法。在本身的@implementation中实现。
扩展就像是匿名的类别,扩展中声明的实例变量和属性、方法都是私有的。扩展中声明的方法可以不实现(但会有issues提示)。
(应当注意的是OC中的扩展和swift中的扩展完全是两回事。swift中的扩展基本上完全相当于OC的类别。)

#import "Student.h"

@interface GoodStudent : Student

@end
#import "GoodStudent.h"

@interface GoodStudent(){
    NSString * _name;
    NSInteger * _age;
}

-(void)fight;
@end


@implementation GoodStudent

-(void)fight {
}

@end

相关文章

  • OC学习总结1 继承(Inherit)和类别(category)

    1.继承Inherit这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。 对于以下情况,无法使用类别,...

  • iOS 类别Category和类拓展Extension的使用与区

    1. 类别Category和类拓展Extension的区别 1>.类别(Category) 类别(Category...

  • OC类别和继承

    OC中protocol、category和继承的区别以前还是有点迷糊,现在结合一些 资料总结一下。 利用继承,...

  • ios内存管理

    速查备忘 OC基础之类别(Category)和扩展(Extension): https://www.jianshu...

  • 类别和延展

    类别和延展 OC中有多继承么,如果没有,用什么代替? OC不支持多继承,如果想要实现多继承的话,可以通过类别和协议...

  • iOS基础知识 (二)

    一、类别 OC不像C++等高级语言能直接继承多个类,不过OC可以使用类别和协议来实现多继承。 1、类别加载时机 在...

  • 2021年最新 iOS面试高级知识

    一、类别 OC不像C++等高级语言能直接继承多个类,不过OC可以使用类别和协议来实现多继承。 1、类别加载时机 在...

  • 分类(category) 和 继承(inherit) 的区别

    分类可以在不知道系统类源代码的情况下,为这个类添加新的方法; 分类只能添加方法,不能添加成员变量。通过分类增加的方...

  • 分类(Category)和继承(Inherit)的区别

    继承(Inherit) 好处:可以抽取重复代码;建立类之间的关系;子类可以拥有父类的方法和属性; 注意点:不可以和...

  • 分类、类扩展与继承

    在OC中,扩展一个类的方式有两种,继承和分类。 分类(Category) 概念 分类(Category),是OC中...

网友评论

      本文标题:OC学习总结1 继承(Inherit)和类别(category)

      本文链接:https://www.haomeiwen.com/subject/ixcosttx.html