ios developers

iOS-Category(分类)底层实现原理

2021-12-05  本文已影响0人  芸芸之尔

OC中Category(分类或者类别)应用场景

为已经存在的类添加方法。可以在不修改原来类的基础上,为一个类扩展方法。最主要的应用:给系统自带的类扩展方法。

OC中Category的底层实现

OC中Category(分类)和Class Extension(扩展)的区别是什么?

OC中Category分类中load、initialize方法的调用的顺序?以及出现继承时他们之间的调用过程?

1. load、initialize方法的区别什么?

2. load、initialize方法在出现继承、Category分类时的调用顺序?

如何实现给Category分类添加成员变量?

在类中定义属性时,会自动的生成该属性的成员变量,声明该属性的setter和getter方法,并生成这些方法的实现。分类在声明属性的时候,只会自动声明setter和getter方法。不会生成成员变量和方法实现。默认情况下,因为Category分类底层结构的限制,是不能添加成员变量。但可以通过关联对象来间接实现。
关联对象提供了以下API(其属于runtimeAPI,需要#import <objc/runtime.h>):
添加关联对象:void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy);
获得关联对象:id objc_getAssociatedObject(id object, const void * key);
移除所有的关联对象:void objc_removeAssociatedObjects(id object) ;
间接实现成员变量效果步骤如下;

  1. 在Category分类.h文件中定义一个属性;@property (copy, nonatomic) NSString *name;
  2. 在Category分类.m文件中实现该属性的setter和getter方法,在setter方法中为该属性添加关联对象,在getter方法中通过关联对象获取该属性的值。代码如下:
- (void)setName:(NSString *)name
{
    // 添加关联参数
    objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name
{
    // 隐式参数
    // _cmd == @selector(name)
    // 获取关联参数值
    return objc_getAssociatedObject(self, _cmd);
}

  1. 如此,这个Category分类的该属性的赋值和取值调用,就与类成员变量的效果相同。代码如下:
        Person *person = [[Person alloc] init];
        person.name = @"jack";
        Person *person2 = [[Person alloc] init];
        person2.name = @"rose";
        NSLog(@"person name is %@", person.name);
        NSLog(@"person2  name is %@", person2.name);
上一篇 下一篇

猜你喜欢

热点阅读