美文网首页
OC的类别和类扩展

OC的类别和类扩展

作者: 一叶知秋0830 | 来源:发表于2019-12-07 15:44 被阅读0次

类别(Category)

类别和分类是一个概念,它是OC中特有的语法,它是一个指向分类的结构体的指针。原则上来说类别是用来给本类扩充方法的,是不可以添加属性和成员变量的。

类别的格式如下(Device是本类名称,括号中的Aditional是分类的名称):

// .h文件
#import "Device.h"

@interface Device (Aditional)

@end
// .m文件
#import "Device+Aditional.h"

@implementation Device (Aditional)

@end

分类的特点如下:

  • 分类结构体指针中只有方法列表,没有属性列表,所以原则上分类只能添加方法,不能添加属性和成员变量。实际上可以通过runtime来添加属性(其实就是通过runtime添加setter/getter方法,不能添加成员变量)。
  • 分类中可以写@property,但是不会生成setter/getter方法和成员变量,在一些特殊的场合可以自己实现setter/getter方法,否则的话直接运行会因为找不到setter/getter方法而报错。
  • 分类中可以访问本类.h中的属性。
  • 如果分类中有和本类中同名的方法,那么最终会执行分类中的方法;如果多个分类中都有和本类同名的方法,那么最终会执行最后一个参与编译的分类中的方法,也就是说这是由编译器决定的。
  • 子类是可以访问父类的分类的方法的。
  • 分类中添加发方法没有实现的话会报警告。分类中添加的方法一般是在分类的@implementation实现,但是如果在编译时如果在分类的@implementation中没有找到方法的实现部分,编译器会向上去本类查找,如果本类也没有那就继续向上去本类的父类查找,所以只要在查找链中有一个地方实现了分类的方法就可以正常运行,否则程序就会崩溃。

类扩展(Extension)

类扩展也叫匿名分类,因为类扩展的格式和分类很现实,只是分类的括号里面是分类名字,而类扩展的括号中是空的,所以叫匿名分类。

其实在实际开发中类扩展使用很频繁。常用的就是在.m文件的@implementation前面添加类扩展部分,其作用是给类添加额外的方法、属性和成员变量。

类扩展格式如下:

#import "Device.h"

@interface Device ()
@property (nonatomic , strong) NSString *deviceName;

// 类扩展中声明的方法要在本类的implementation中实现,否则会报警告
- (void)testFunction;

@end

@implementation Device

- (void)testFunction{
    
}

@end

类扩展的特点如下:

  • 类扩展不但可以添加方法,也可以添加属性和成员变量。
  • 类扩展添加的成员变量默认是@private的。
  • 类扩展中添加的方法没有实现的话也会报警告。
  • 类扩展不像分类那样拥有独立的@implementation部分,所以类扩展添加的方法的实现要在本类的@implementation中来实现。
  • 一般类扩展是写在.m文件中,此时类扩展中的方法是私有的。但类扩展也是可以写在.h文件中的,此时类扩展中的方法是公有的。
  • 当调用类扩展中添加的方法时,会首先在当前类中去查找该方法的实现,如果当前类中没有实现就会去其父类查找,直到找到该方法的实现未知,如果一直找到基类都没有找到这个方法的实现就会报错。

相关文章

  • OC的类别和类扩展

    类别(Category) 类别和分类是一个概念,它是OC中特有的语法,它是一个指向分类的结构体的指针。原则上来说类...

  • iOS面试题-常规概念

    简要叙述OC语言的特点 类别的作用?继承、类别和扩展在实现中有何区别? OC中类变量的@protected,@pr...

  • OC 类别(分类)+类扩展

    适用范围 当你已经封装好了一个类(也可能是系统类、第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中...

  • 容易被忽视的类扩展

    基础知识 类扩展(class extension)是一种特殊的OC类别(category),它没有类别名,小括号里...

  • 类别(Category)与类扩展 (Extension)的区别

    类别(Category)与类扩展 (Extension)的区别 iOS 类别和扩展(Categories和Exte...

  • 什么是类别(Category)

    9:什么是类别(Category) 类别category 是oc中一个灵活的类扩展机制,用于在不熟悉,不改变原来的...

  • ios内存管理

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

  • 类别、继承和类扩展

    基础知识是很重要的,但往往容易被忽视,就个人而言出现的问题很多都是由于自身对基础知识的理解不充分导致的。所以,我们...

  • iOS 类别和类扩展

    背景: 给一个类添加方法,同时不让子类继承该方法,所以产生了类别(分类) category: 一个结构体指针,原则...

  • iOS 类别和类扩展

    category和extensions不同在于extensions可以添加属性,并且添加的方法必须实现,exten...

网友评论

      本文标题:OC的类别和类扩展

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