84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
我知道category方法是可以覆盖系统的方法,但是当有几个category重写同一个方法的时候调用顺序是怎么样子的啊?我开始写代码测试了一下,看不出来是按什么顺序来的,总是后面创建的category的方法被调用,其他的都被覆盖了。。。很想知道这是为什么,怎么证实这一点,依据是什么。。。有知道的朋友指点一下下咯☺
欢迎选择我的课程,让我们一起见证您的进步~~
根据runtime的消息传递机制中的核心函数void objc_msgSend(id self,SEL cmd,...)来发送消息,先从当前类中查找调用的方法,若没有找到则继续从其父类中一层层往上找,那么对于category重写同一个方法,则在消息传递的过程中,会最先找到category中的方法并执行该方法。对于多个分类调用同一个方法,Xcode在运行时是根据buildPhases->Compile Sources里面的从上至下顺序编译的,编译时通过压栈的方式将多个分类压栈,根据后进先出的原则,后编译的会被先调用,当objc_msgSend找到方法并调用之后,就不再继续传递消息,所以形成所谓上的覆盖。并不是后面创建的就一定被调用,得看创建之后其在buildPhases->Compile Sources里面的位置。
按runtime加载分类方法的顺序来覆盖一般实现的就是最后一个加载分类的方法
根据runtime的消息传递机制中的核心函数void objc_msgSend(id self,SEL cmd,...)来发送消息,先从当前类中查找调用的方法,若没有找到则继续从其父类中一层层往上找,那么对于category重写同一个方法,则在消息传递的过程中,会最先找到category中的方法并执行该方法。对于多个分类调用同一个方法,Xcode在运行时是根据buildPhases->Compile Sources里面的从上至下顺序编译的,编译时通过压栈的方式将多个分类压栈,根据后进先出的原则,后编译的会被先调用,当objc_msgSend找到方法并调用之后,就不再继续传递消息,所以形成所谓上的覆盖。并不是后面创建的就一定被调用,得看创建之后其在buildPhases->Compile Sources里面的位置。
按runtime加载分类方法的顺序来覆盖
一般实现的就是最后一个加载分类的方法