分类

作者: 比特_0bd7 | 来源:发表于2017-12-14 18:07 被阅读0次

###那么原方法失效,分类方法生效的原理是?想弄清这点先来看一下类的初始化,首先oc是动态语言,建立在runtime 的基础上,同样类的初始化也是动态的,根类NSObject 的+load和+initilize两个方法,用于类的初始化,我们这里要着重看的是+load方法:+load方法是当类或分类被添加到 Objective-C runtime 时被调用的,实现这个方法可以让我们在类加载的时候执行一些类相关的行为。子类的+load方法会在它的所有父类的+load方法执行之后执行,而分类的+load方法会在它的主类的+load方法执行之后执行。但是不同的类之间的+load方法的调用顺序是不确定的。原因就在这里,因为加载顺序是父类先+load,然后子类+load,然后分类+load,那么如果分类重写子类方法:首先子类+load,将方法添加到类的方法列表methodLists,然后分类+load,将重写的方法添加到方法列表中,但是这里存在几点疑问:1. 方法列表methodLists里是否会有两个SEL相同的方法?2. 如果会有,这两个方法在方法列表中的顺序是怎样的?(顺序决定哪个被调用)下面来求证一下:```#import "TestCategory.h"/*主类实现*/@implementation TestCategory- (void)newMethod { NSLog(@"主类");}@end#import "TestCategory+add.h"/*分类一实现*/@implementation TestCategory (add)- (void)newMethod { NSLog(@"分类一");}@end#import#import "TestCategory.h"@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; id LenderClass = objc_getClass("TestCategory"); unsigned int outCount, i; //获取实例方法列表 Method *methodList = class_copyMethodList(LenderClass, &outCount); for (i=0; iCompile Sources里面的顺序从上至下编译的,那么很明显就像子类和分类一样,后编译的后load,即后添加到方法列表,所以后编译的分类,方法会放到方法列表顶部,调用的时候先执行。

添加代码验证一下:

```

#import "TestCategory+addAgain.h"

/*分类二实现*/

@implementation TestCategory (addAgain)

- (void)newMethod {

NSLog(@"分类二");

}

@end

```

看输出

```

2017-07-19 22:18:13.593 TestRuntimeProperty[28385:1331972] instanceMethod:newMethod

2017-07-19 22:18:13.593 TestRuntimeProperty[28385:1331972] instanceMethod:newMethod

2017-07-19 21:18:13.593 TestRuntimeProperty[28385:1331972] instanceMethod:newMethod

2017-07-19 22:18:13.594 TestRuntimeProperty[28385:1331972] 分类一

```

结果输出仍然是分类一,那就说明"TestCategory+add.h"在buildPhases->Compile Sources里面的顺序是靠下的,看下buildPhases的确如此:

相关文章

  • 一次性产品

    包装材质分类 牙具分类 牙膏分类 梳子分类 拖鞋材质

  • 一明音频6按次序表答

    分类演讲,有条理,按男女分类,年龄分类,籍贯分类,其它。职业分类,戴眼镜,头发分类,例如对深圳的认识?一,天气,二...

  • 客户分类

    酒店布草租赁项目:市场细分是动脑干活的基础!数量分类、地域分类、男女分类、品牌分类、出租率分类、价格分类等等!举例...

  • 分类页面通用变量

    $sortid分类id $sortName分类名称 $template分类模版 $lognum该分类文章数 $so...

  • Excel学习笔记5

    知识点 1.分类汇总工具 -必须先排序再分类汇总 分类字段 -分类汇总-全部删除 可以撤销掉之前的分类汇总 -分类...

  • 生活垃圾分类

    1、什么是垃圾分类 生活垃圾分类通俗得说就是在源头将生活垃圾进行分类投放,并通过分类收集、分类运输和分类处理,力争...

  • 机器学习之分类器

    0、分类器热身,NextStep比较懒,直接看图 分类分类,先分解再分类,比如,疾病分类模型先将病情的表现信息进行...

  • 商品管理案例——案例准备

    一、案例的概述 1、案例实现的功能 分类管理  查询分类  添加分类  删除分类  修改分类 商品管理  查询商品...

  • 分类(Category)与类拓展(Extension)

    分类(Category) 1.分类(Category)是什么? 分类是oc特有的语法,表示指向分类的结构体指针。分...

  • Emlog531获取指定分类的子分类信息

    //获得指定分类的子分类,参数为分类ID function getsubcategoryinfo($categor...

网友评论

      本文标题:分类

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