美文网首页将来跳槽用iOS面试题
iOS面试题:分类和类扩展区别,为啥分类不能添加成员变量,如何给

iOS面试题:分类和类扩展区别,为啥分类不能添加成员变量,如何给

作者: iOS猿_员 | 来源:发表于2019-08-28 20:42 被阅读0次
一、 分类和类扩展区别
1. 分类实现原理
  • Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息
  • 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)
2. Category和Class Extension的区别是什么?
  • Class Extension在编译的时候,它的数据就已经包含在类信息中
  • Category是在运行时,才会将数据合并到类信息中
二、 分类为啥不能添加成员变量

先看Category的底层结构

struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;  // 对象方法列表
    const struct _method_list_t *class_methods;  // 类方法列表
    const struct _protocol_list_t *protocols;  // 协议列表
    const struct _prop_list_t *properties;  // 属性列表
};

1.从结构体可以知道,有属性列表,所以分类可以声明属性,但是分类只会生成该属性对应的getset声明,没有去实现该方法
2.结构体没有成员变量列表,所以不能声明成员变量。

1. Category的加载处理过程
  • 1.通过Runtime加载某个类的所有Category数据
  • 2.把所有Category的方法、属性、协议数据,合并到一个大数组中,后面参与编译的Category数据,会在数组的前面
  • 3.将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面
三、关联对象给分类添加属性

代码实现如下

  • Student+Extern.m
#import "Student+Extern.h"
#import <objc/runtime.h>

static NSString *nameKey = @"nameKey";   //定义一个key值

@implementation Student (Extern)

- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY);
}

- (NSString *)name {
    return objc_getAssociatedObject(self, &nameKey);
}

@end

外界调用

Student *stu = [[Student alloc] init];
stu.name = @"乔碧萝";
NSLog(@"name = %@",stu.name);

运行结果 - 关联成功

但是注意,以上代码仅仅是手动实现了setter/getter方法,但调用_成员变量依然报错。


更多:iOS面试题合集

相关文章

  • 类扩展 与 关联对象的底层原理探索

    类扩展、分类的区别 1. Category(分类或者类别) 专门给主类添加新的方法 不能给分类添加成员变量(添加了...

  • iOS底层学习:类的扩展和关联对象

    类的扩展和分类 category:分类、类别 给类增加方法 不能添加成员变量 可以使用runtime给分类添加属性...

  • 十四、关联对象

    分类与类扩展 category∶类别,分类 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也无法...

  • 类的加载(三)

    类扩展 类扩展 VS 分类 category 专门用来给类添加新的方法 不能给类添加成员属性,添加了成员变量,也...

  • iOS面试题:分类和类扩展区别,为啥分类不能添加成员变量,如何给

    一、 分类和类扩展区别 1. 分类实现原理 Category编译之后的底层结构是struct category_t...

  • 面试题集锦1(更新)

    1.类扩展和分类的区别 类扩展:没有名字可以为某个类增加额外的属性、成员变量和方法 分类:有名字只能扩充方法,不能...

  • 分类的关联属性

    类扩展和分类的区别 category:就是类别,也叫分类,专门用来给类添加新的方法,不能给类添加成员属性,但可以使...

  • iOS面试题09- 基础篇

    《2018 iOS面试题系列》 1、category 和 extension 的区别 分类有名字,类扩展没有分类名...

  • Category原理解析(2)-关联对象

    1.分类为什么不能添加属性(成员变量)? ①.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有成员变量列...

  • 十六、关联对象

    分类和类别 1: category: 类别,分类 专门用来给类添加新的方法 不能给类添加成员 属性,添加了成员变量...

网友评论

    本文标题:iOS面试题:分类和类扩展区别,为啥分类不能添加成员变量,如何给

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