xml地图|网站地图|网站标签 [设为首页] [加入收藏]

objc类与对象,方法的执行顺序以及类和对象的关

来源:http://www.ccidsi.com 作者:集成经验 人气:123 发布时间:2020-03-29
摘要:h2方法/h2 率先,对象方法list runtime使用objc_msgSend(receiver,selectorState of Qatar对艺术开展调用 receiver是情势的调用者, selector则是格局@selector其实是方法名 在调用方法时在receiver中的methodl

<h2>方法</h2>

率先,对象方法list runtime使用objc_msgSend(receiver, selectorState of Qatar对艺术开展调用 receiver是情势的调用者, selector则是格局@selector其实是方法名 在调用方法时在receiver中的method list中找到该方法然后再找到它的IMP,假诺找不到的话那就能够发出unrecognized selector而形成crash。当然这个时候也还会有补救措施,这便是轶闻中的消息转载。首先第一回是在 resolveInstanceMethod:或者 resolveClassMethod: 在那大家能够加上叁个函数调用,然后回到yes那样安然了。若无就进行fast forwarding完成-forwardingTargetForSelector:方法实行对象转移,约等于改换方法的调用者。纵然还并未有调用就-methodSignatureForSelector:通过这几个函数进行取得参数,在此进行签订契约NSInvocation并发送-forwardInvocation:,否则就能够引致crash。对象方法列表寄存在类对象中。

先掌握一下应用运营以往,做了怎样。main.m 中的 main(卡塔尔国是先后的输入,但在进入 main 函数在此之前,程序就实践了过多代码(不然也不会运转那么久)。运行后奉行顺序:将前后相继信赖的动态链接库加载进内部存款和储蓄器加载可试行文件中的全体符号、代码runtime 拆解深入分析被编写翻译过的标识代码,遍历所有 Class,按世襲层级依次调用Class 的 load 方法和其 Category 的 load 方法。

void method_exchangeImplementations(Method m1, Method m2)

16.09.14补充

率先来做点测验,来探视 load 方法的施行种种。先建多个 Single View Application。展开 Build Phases 的 Compile Sources,如下图:

method swizzling是二个oc 的一种黑魔法他出力是换到方法的imp指针,imp指针是一个照准方法的指针,就好像isa指针相似区别的是isa指向的是指标。<h2>使用情状</h2>最简便的多个施用,切换夜晚方式的时候,我们加载两套图片。确定试行的代码不相同,但是进行的措施名字供给一致<h3>使用地方</h3>平常景色情状采纳地方在 load里面使用, load是在类早先化的时候调用, initialize是在实例化类的时候调用。所以 initialize方法可能不会被调用。可是作者这一次未有在 load中调用,因为自个儿是索要切换回来。<h3>效果</h3>

id objc_msgSend(id self, SEL op, ...) {

图片 1显示屏快速照相二〇一六-05-10 13.02.51.png

图片 2弹簧按键.gif

if return nil;

在种种类的 @implementation 里加上

现在指标是讲求重写setHighlighted:方法点击“无动漫”开关要求切换回原本的艺术<h4>推动漫高亮方法</h4>

IMP imp = class_getMethodImplementation(self->isa, SEL op);

  load { NSLog(@"%s", __func__);}
/** * 带动画的高亮方法 */-AI_setAnimationHighlighted:animationHighlighted{ [self spring];}

imp(self, op, ...卡塔尔; //调用这么些函数,伪代码...

来探视每种类的 load 方法的调用顺序(main.m 作者做了特殊管理)。以下是运维结果:

<h4>动画</h4>

}

 JMTestDemo[14939:1769791]  [ViewController load] JMTestDemo[14939:1769791]  [AppDelegate load] JMTestDemo[14939:1769791]  [ClassMain load]
/*** 弹簧动画*/-spring{ [UIView animateWithDuration:self.animationTime animations:^{ self.transform = CGAffineTransformMakeScale; self.alpha = 0.3; } completion:^(BOOL finished) { self.alpha = 1; }]; self.transform = CGAffineTransformIdentity;}

//查找IMP

梯次和 Compile Sources 顺序一致,最近来看,Compile Sources 的依次正是load 方法的调用顺序。

<h4>切换格局</h4>

IMP class_getMethodImplementation(Class cls, SEL sel) {

再来一个测量检验,依次拉长 ClassFather,以至它的子类 ClssSon,以致另叁个ClassA。结果 Compile Sources 的依次和自身想象中的不相像,如下图

/*** 切换方法从A切换到B*/-changeMethod:actionA toMethod:actionB{ //原有的高亮方法 Method aMetod = class_getInstanceMethod([AISpringButton class],actionA); //动画高亮方法 Method bMetod = class_getInstanceMethod([AISpringButton class], actionB); //这句是为了保护系统的方法 BOOL isAdd = class_addMethod([AISpringButton class], actionA, method_getImplementation, method_getTypeEncoding; if  { class_replaceMethod([AISpringButton class], actionB, method_getImplementation, method_getTypeEncoding; }else{ method_exchangeImplementations(aMetod, bMetod); }}

if (!cls || !sel) return nil;

图片 3显示器快速照相二零一五-05-10 13.10.18.png

<h5>demo地址</h5>github:

IMP imp = lookUpImpOrNil;

看起来不要规律啊。(那是几个标题,先记下一下)

if return _objc_msgForward; //_objc_msgForward 用于新闻转载

其有时候小编退换各种,将 ClassSon 移动到最前头,ClassFather 移动到最末尾。如图

return imp;

图片 4显示屏快照二〇一四-05-10 13.49.31.png

}

上边是运维结果:

IMP lookUpImpOrNil(Class cls, SEL sel) {

 JMTestDemo[15034:1788736]  [ClassFather load] JMTestDemo[15034:1788736]  [ClassSon load] JMTestDemo[15034:1788736]  [ViewController load] JMTestDemo[15034:1788736]  [AppDelegate load] JMTestDemo[15034:1788736]  [ClassA load] JMTestDemo[15034:1788736]  [ClassMain load]

if (!cls->initialize {

也等于本应先实践 ClassSon load 方法,但先实行了 ClassFather load 方法,再来一回测量检验。小编将 ClassSon 里的 load 方法注释掉,以下是运作结果:

_class_initialize;

 JMTestDemo[15055:1791953]  [ViewController load] JMTestDemo[15055:1791953]  [AppDelegate load] JMTestDemo[15055:1791953]  [ClassA load] JMTestDemo[15055:1791953]  [ClassMain load] JMTestDemo[15055:1791953]  [ClassFather load]

本文由68399皇家赌场发布于集成经验,转载请注明出处:objc类与对象,方法的执行顺序以及类和对象的关

关键词: 顺序 对象 OC Method Swizzling

上一篇:自己写顶部滚动标签栏,Guides的动画效果

下一篇:没有了

最火资讯